Хранение времени - используйте поле времени или Int?(База данных PHP и MySQL) - PullRequest
2 голосов
/ 26 ноября 2011

Рассмотрим SQL-запрос ниже:

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 поля типа TIME.

Я использую MySQL.

Предположим, что open_time«18:00», close_time «02:00», текущее время «22:41».У нас есть отдельная запись в БД для close_time (потому что это после полуночи), но мы никогда не получим ее в результате, потому что close_time "02:00" НЕ больше текущего времени, "22:41".

Также, если текущее время равно «01:00», мы получим СЛЕДУЮЩИЕ значения дня, потому что день недели не совпадает.

Решение?

Вы бы предпочли хранить эти значения в целых числах (минутах), чтобы php мог обрабатывать эти значения напрямую, без какого-либо преобразования?

Например ...

Текущее время:

$timearr = explode(':',date("w:H:i"));
$currenttime = ($timearr[0]) * 1440 + $timearr[1] * 60 + $timearr[2] 

Минимальное значение текущего времени = 0 (вс, 00:00), максимальное значение 10079 (сб, 23:59)

В базе данных хранятся значения времени открытия / закрытияможет быть между 0 и 11519 (сб, 47:59)

Теперь предположим, что текущее время - «Солнце, 01:00» (первый день недели), при выполнении вышеуказанного покрытия это значение равно 60;и время открытия / закрытия для последнего дня недели (суббота) установлено на «17:00» и «02:00» (что фактически является воскресеньем), сохраненных в БД как 9660 и 10200 (суббота, 26:00),В этом случае вышеупомянутый запрос не найдет нужную нам запись (Сб, 17:00, 02:00), потому что у нас, вероятно, нет open_time меньше, чем «02:00» (120).Чтобы решить эту проблему, мы конвертируем «Sun, 01:00» в «Sat, 25:00», добавляя 7 * 1440 (целую неделю) к $ currenttime, что приведет к 10140. Затем запрос к БД будет выглядеть так:

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);

Или что такое альтернативное и аккуратное решение?

Ответы [ 2 ]

7 голосов
/ 26 ноября 2011

Из своего опыта я научился всегда хранить вещи такими, какие они есть, и правильно использовать типы данных, поэтому я бы порекомендовал вариант времени или даты-времени. Когда вы начнете делать с ним что-нибудь еще, лучше иметь его в правильном формате и просто привести к отображению, сортировке и т. Д.

Все известные мне базы данных SQL поддерживают форматы даты / даты / времени / времени, конечно, mysql.

Если вам когда-либо понадобится переместить его, т. Е. Экспортировать его в другую базу данных или формат, вы будете использовать инструмент (даже если это просто скрипт SQL), который будет иметь возможность преобразовать его в другой формат или тип.

1 голос
/ 26 ноября 2011

Используйте INT, поскольку не все базы данных поддерживают поля DATE или поддерживают их одинаково.INT гораздо более переносим, ​​и точно так же легко определить дату с помощью целочисленной отметки времени, если вы выберете этот маршрут.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...