Jak radzić sobie z czasami i po północy w PHP/MySQL?Radzenie sobie z czasami i po północy
Należy użyć minuta lub użyć pola typu ?
Rozważmy zapytań SQL poniżej:
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
pola są TIME
typ pola.
Załóżmy, że open_time ma wartość "18:00", czas zamknięcia to "02:00", aktualny czas to "22:41". Mamy oddzielny rekord DB dla czasu zamknięcia (bo jest po północy), ale nigdy nie otrzymamy go w wyniku, ponieważ czas zamknięcia "02:00" NIE jest większy niż aktualny czas, "22:41".
Również jeśli bieżący czas to "01:00", otrzymamy NEXT wartości dnia, ponieważ dzień tygodnia nie pasuje.
Jakie jest rozwiązanie?
Czy wolisz przechowywać te wartości w INT
(minuty), więc php może przetwarzać te wartości bezpośrednio, bez jakiejkolwiek konwersji?
Na przykład ...
Aktualny czas:
// w = Day of the week, H = 24-hour format, i = Minutes
$timearr = explode(':',date("w:H:i"));
$currenttime = ($timearr[0]) * 1440 + $timearr[1] * 60 + $timearr[2]
W bazie danych zapisane open/close wartości czasu w minutach.
Załóżmy teraz, że aktualny czas to "Słońce, 01:00" (pierwszy dzień tygodnia), wykonując powyższą okładkę, ta wartość wynosi 60; a czasy otwarcia/zamknięcia ostatniego dnia tygodnia (soboty) są ustawione na "17:00" i "02:00" (co jest faktycznie niedzielą), przechowywane w DB jako 9660 i 10200 (sobota, 26:00) . W tym przypadku powyższe zapytanie nie znajdzie potrzebnego rekordu (Sat, 17:00, 02:00), ponieważ prawdopodobnie nie mamy żadnego okresu open_time krótszego niż "02:00" (120). Aby rozwiązać ten problem, konwertujemy "Słońce, 01:00" na "Sob, 25:00", dodając 7 * 1440 (cały tydzień) do $ currenttime, co da 10140. Następnie zapytanie DB wygląda następująco:
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);
A co jest rozwiązaniem alternatywnym i schludniejszym?
Może przechowywać datę wraz z czasem? po północy czas staje się czasem jutrzejszym. Użyj również formatu DATETIME, a nie INT lub innych. –
Nie Nie mogę użyć DATETIME, ponieważ nie używam Date. Kupuj codziennie, nie chcę dodawać daty przez cały rok! –
http://stackoverflow.com/questions/8225684/how-to-find-out-if-store-open-lub-close-dealing-withh godzin –