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ür Sunday 10 am oder 42230 für Thursday 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.
InformationsquelleAutor I'll-Be-Back | 2011-11-25
Schreibe einen Kommentar