2009-10-08 10 views
5

Dummes einfaches Problem, aber ich konnte keine elegante Lösung finden. Ich möchte Zeitintervalle in einer MySQL-Spalte speichern, zum Beispiel:Beste Methode zum Speichern von Zeitintervallwerten in MySQL?

1:40 (für eine Stunde, 40 Minuten) 0:30 (30 Minuten).

Dann können Sie Abfragen ausführen, summieren sie. Momentan speichere ich sie als INT-Werte (1.40), aber ich muss die Addition manuell vornehmen (es sei denn, mir fehlt ein einfacher Weg).

Der TIME-Spaltentyp speichert nur bis zu 900 Stunden (ungefähr, denke ich), also ist das für mich (fast) nutzlos, da ich Hunderttausende von Stunden aufspüre (ich speichere ein Feld mit einer Summierung von vielen verschiedenen Einträge).

Danke!

Antwort

8

Speichern Sie nur die Minuten, also 1:40 wird als 100 gespeichert. Dies macht eine einfache Addition: 100 + 30 = 130. Wenn Sie anzeigen, tun Sie die Mathematik, um zurück zu Stunden: Minuten. 130 Minuten -> 2:10.

+0

Ich habe eine ähnliche Sache in einer meiner Apps gemacht, aber ich speichere stattdessen die Sekunden, so dass meine Summe nicht alle diese Teilminuten verliert. –

+2

ja, wenn Sie Sekunden verfolgen müssen, dann tun Sie Sekunden. aber die Frage fragt nur nach Minuten. – longneck

4

Ich würde sie einfach in einem INT-Feld als Sekunden oder Minuten (oder was auch immer die niedrigste Zeit Wert Sie arbeiten).

Als Beispiel möchten Sie die folgenden Zeitwert 1 h 34 min 25 Sekunden speichern:

Das 5665 Sekunden ist. So speichert nur den Wert als 5665 in einem INT Feld

Später können Sie sagen dem Zeitwert 56 min 7 Sekunden gespeichert werden sollen:

Das ist 3367 Sekunden.

Summe alles auf später: 5665 + 3367 = 9032 Sekunden

konvertieren, die zurück in Stunden, Minuten, Sekunden, Sie 2 Stunden 30 Minuten 32 Sekunden erhalten. Ja, Sie müssen die Berechnungen durchführen, um die Konvertierung durchzuführen, aber es ist eine sehr einfache Berechnung und es ist überhaupt nicht maschinenintensiv, da Sie es nur einmal tun, entweder bevor Sie das INT speichern oder nachdem Sie das INT abgerufen haben.

4

Sie können auf jeden Fall ein int Feld für diese, vor allem, weil MySQL die DATE_ADD und DATE_SUB Funktionen für die Verwendung von Integer-Zeiteinheiten neben Datum und Datumzeit-Typen Datum artihmetic bietet.

Zum Beispiel, wenn Sie eine Datetime-Spalte eventDateTime haben, und Sie haben eine Dauer Spalte durationMinutes können Sie die Endung Datetime mit berechnen:

DATE_ADD(eventDateTime,INTERVAL durationMinutes MINUTE) 
+0

Schön, Sie zeigen die Abfrage auch – Va1iant

0

Wenn Sie sie als Stunden speichern wollen, und halten so die ganze Zahl klein, können Sie die Anzahl der Minuten nehmen und durch 60 dividieren.

Also 1:40 wird 100/60 = 1.66,: 30 wird 30/60 = .5.Jetzt können Sie sie einfach addieren sich normalerweise:

1.66 + .5 = 2.16 

und dann haben Sie die Anzahl der Stunden als Ganzes, und der Dezimalteil ist die Anzahl der Minuten über 60, so dass sein würde

.16 * 60 = 10 

so ist es 2:10

Ihre nächste beste Option ist zu sehen, ob MySQL base60 kann.

+1

Wenn Sie die Stunden als Gleitkommawerte speichern, könnten Sie Rundungsfehler auftreten, e. G. 100 Minuten sind * nicht * genau 1,66 Stunden. Bei weiteren Operationen wird der Fehler größer. – joschi

+0

Warum schwimmt? Speichern Sie einfach die Sekunden, wenn Sie die Sekunden möchten. Sogar 32 Bit sind dafür genug, und Sie werden nicht zu Rundungsfehlern kommen. Für Millisekunden gibt es 64-Bit-Int-Typen (BIGINT für die meisten SQL-Datenbanken). – Frizi

+0

Keine Sekunden, Minuten. Und Op verlangte nach einer Möglichkeit, Zeitmengen mit Stunden als Basis zu speichern (also wären die Minuten ein Bruchteil der Basis). Erinnere dich nicht einmal daran, warum Floats ideal schienen. – Anthony

0

Ich weiß, dass dies nicht die Art von Zeitintervall ist, über die du sprichst, als ich in der Umgebung nach der einzig relevanten SO-Frage suchte, um anderen verlorenen Seelen wie mir zu helfen was ich jetzt mache.

Ich bin Speichern einer Zeichnungslänge, die nicht präzise Werte wie „Anzahl von Sekunden“ oder sogar Minuten entweder Tage oder Monate. Also in meinem Fall habe ich eine "duration" INT und eine "duration_unit" ENUM von ('days', 'monates').

Also für ein "6-Monats" -Abonnement, anstatt zu versuchen, zu berechnen, wie viele Minuten in einem 6 Monate sind (das hängt davon ab, welche 6 Monate Sie sprechen) Ich nur speichern "6" und "Monate".

Mit der PHP-Methode mktime() können Zeitintervalle von +6 Monaten einfach und genau berechnet werden.

Verwandte Themen