Speicherung der Zeiten - verwenden Sie Zeit-oder Int-Feld? (PHP & mySQL-Datenbank)
Betrachten Sie die SQL-Abfrage unter:
SELECT * FROM opening_hours
WHERE week_day = WEEKDAY(NOW()) + 1
AND open_hour =< date_format(now(),'%H:%i')
AND close_hour >= date_format(now(),'%H:%i')
open_hour
/close_hour
Felder sind ZEIT geben.
Ich bin mit MySQL.
Nehme an, dass open_time ist "18:00", close_time ist "02:00", aktuelle Uhrzeit "22:41". Wir haben einen separaten DB-Datensatz für die close_time (denn es ist nach Mitternacht), aber wir werden nie bekommen es in der Folge, weil die close_time "02:00" ist NICHT größer als die aktuelle Uhrzeit "22:41".
Auch wenn aktuelle Uhrzeit "01:00", bekommen wir am NÄCHSTEN Tag Werte, weil der Wochentag nicht überein.
Lösung?
Würden Sie lieber speichern Sie diese Werte in ganze Zahl (Minuten), so dass die php in der Lage ist, diese Werte direkt, ohne Konvertierung?
Zum Beispiel...
Aktuelle Zeit:
$timearr = explode(':',date("w:H:i"));
$currenttime = ($timearr[0]) * 1440 + $timearr[1] * 60 + $timearr[2]
Minimal-Wert der aktuellen Zeit = 0 (Sun, 00:00), max-Wert ist 10079 (Sa, 23:59)
In der Datenbank, die gespeichert öffnen/schließen-Zeit-Werte können zwischen 0 und 11519 (Sa., 47:59)
Nehmen wir nun an, dass die aktuelle Zeit ist "Sun, 01:00" (der erste Tag der Woche), die Ausführung der oben coversion dieser Wert ist 60; und die öffnen/schließen-Zeiten für den letzten Tag der Woche (Samstag) auf "17:00" und "02:00" (eigentlich Sonntag), gespeichert in der DB als 9660 und 10200 (Samstag, 26:00). In diesem Fall wird die obige Abfrage wird nicht die Platte, die wir brauchen (Sat, 17:00, 02:00), da wir wahrscheinlich nicht alle open_time weniger als "02:00" (120). Um dieses Problem zu lösen, wir konvertieren", Sun, 01:00" bis "Sat, 25:00", durch hinzufügen von 7*1440 (eine ganze Woche), um die $currenttime, was 10140. Dann die DB-Abfrage wie diese:
SELECT open_time,clos_time FROM open_hours
WHERE (open_time <= $currenttime
AND close_time >= $currenttime)
OR (open_time <= $currenttime +10080
AND close_time >= $currenttime + 10080);
Oder was ist alternativer und sauberer Lösung?
- Ich habe eine Frage: Sind Sie wollen, speichern Sie jeden Tag öffnen und schließen Zeiten, als in 365/366 ein Jahr, oder nur die von Montag bis Sonntag geben?
- Nur Mo bis so
- Dann verwenden Sie einen ganzzahligen Darstellung als @AlienWebGuy schlägt. So etwas wie
71000
fürSunday 10 am
oder42230
fürThursday 10:30 pm
. Sie brauchen nicht wirklich ein Datum/Zeit Feld Typ. - thx für die Anregung, ich Frage mich, was der Zweck der Zeit geben? Was ist freaking me out ist, dass die Speicherung als INT-Minuten-Werte sehen wirklich chaotisch:)
- Gut, du weißt, ich es immer war und
time()
in PHP verwirrt und dachte, es war wie ein timestamp, nicht nur die formatierte Zeit nur. Tut mir Leid, dass. Ich würde noch sagen, dass Sie tun konnte, die integer Methode ebenso einfach, es würde nur davon abhängen, ob Sie umrechnen möchten Sie die Werte wieder auf ein "human-readable" format oder nicht. Es ist weniger DB-Anbieter-spezifischen, als auch, was kann oder kann nicht ein Faktor sein.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden
INT
da nicht alle Datenbanken unterstützenDATE
Felder oder unterstützen Sie in der gleichen Weise.INT
ist viel mehr tragbar und genauso einfach ist es herauszufinden, Ihr Datum mit der integer-Zeitstempel, wenn Sie diesen Weg gehen.Time
geben. Ganze zahlen ausschließlich. Ich habe sogar gehört von DBA ' s zu verwendenINT
oderTINYINT
als 1/0-Felder anstelle vonBOOL
für noch mehr Portabilität, aber das ist eine andere Diskussion ganz 🙂Ich habe aus Erfahrung gelernt, immer speichern Dinge wie Sie sind und verwenden von Datentypen passend so würde ich empfehlen, die Zeit oder das Datum-Zeit-option. Wie Sie beginnen, etwas anderes zu tun mit ihm ist es besser, es in das richtige format, und nur wirken, für die Anzeige, Sortierung, etc.
Alle SQL-Datenbanken, die ich kenne-Unterstützung Datum /Datum/Zeit /Zeit-Formate, sicherlich mysql.
Wenn Sie jemals brauchen, um es zu verschieben, d.h. exportieren Sie es in ein anderes db-format oder werden Sie mit einem Werkzeug (auch wenn es nur ein sql-Skript), die die Fähigkeit haben, um es umwandeln in ein anderes format oder Typ.
TIME
können Sie zu gehen bis zu838:59:59
im Wert, so dass Sie könnte26:00:00
für2 am
würden Sie nur haben, um es in Ihrem PHP-code als solchen.