Проверьте, есть ли время сегодня или завтра

#mysql #sql #time

#mysql #sql #время

Вопрос:

В MySQL у меня есть три столбца ( IsActive , OpenTime и CloseTime ) в restaurant таблице. Я добавил задание CRON для определения ресторанов, которые необходимо открыть или закрыть, а затем соответствующим образом обновляю статус. Предположим, у меня есть следующие данные:

 IsActive |OpenTime |CloseTime ---------|---------|--------- 1 |13:00 |1:00 0 |8:00 |20:00  

Ниже приведен SQL:

 SELECT * from `restaurant` WHERE  (  IsActive = 0  AND  STR_TO_DATE(CONCAT(CURDATE(), ' ', `OpenTime`), '%Y-%m-%d %H:%i') lt; NOW()  )  OR  (  IsActive = 1  AND  STR_TO_DATE(CONCAT(CURDATE(), ' ', `CloseTime`), '%Y-%m-%d %H:%i') lt; NOW()  )  

Все работает хорошо, но логика подводит, когда дата закрытия на следующий день, как вы знаете, после 11:59 вечера это следующий день, но STR_TO_DATE(CONCAT(CURDATE(), ' ', OpenTime), '%Y-%m-%d %H:%i') CURDATE() сегодня, и я не знаю, как сделать это на следующий день. Из-за этого 1-я строка переключается на 1 и 0 всякий раз, когда запускается CRON. Потому 1:00 что на сегодня меньше, чем в настоящее время.

Комментарии:

1. после подачи STR_TO_DATE заявки проверьте , если CloseTime lt; OpenTime , 1 день до CloseTime

2. @ProGu можете ли вы написать об этом в ответе? Я понял вашу точку зрения, но не могу понять ее 🙁

3. Использование cronjob для постоянного обновления активного статуса ресторана-ужасная идея. Вы можете создать столбец isActive как сгенерированный столбец (или представление) с помощью логики, предоставленной Салманом А

4. Извиняюсь, я ошибался насчет возможности использовать CURRENT_TIME в сгенерированном столбце (только детерминированные функции), но его определенно можно использовать в эквивалентном представлении.

Ответ №1:

Логика проверки того, находится ли текущее время между двумя временами (что может быть на противоположной стороне от полуночи), проста:

  • Если время открытия lt;= Время закрытия, то проверьте, если время открытия lt;= ТЕКУЩЕЕ ВРЕМЯ И ТЕКУЩЕЕ ВРЕМЯ
  • В противном случае проверьте, открыто ли lt;= ТЕКУЩЕЕ ВРЕМЯ Или ТЕКУЩЕЕ ВРЕМЯ

Тем не менее, вам не нужна активная колонка. Просто запросите активные рестораны по запросу.

Комментарии:

1. Эй! Ваше состояние неправильное, я пробовал со многими примерами, допустим, начало = 08:00, конец = 20:00, начало = 02:00 теперь проверьте свое состояние, оно говорит ПРАВДУ, но сейчас 2 часа ночи, ресторан должен быть открыт.

2. Я этого не понимаю. Что касается вашего первого комментария: ресторан должен быть закрыт в 2 часа ночи, и мой запрос возвращает false, т. е. не открыт.

3. о, хорошо, я понял , OpenTime lt;= CURRENT_TIME And CURRENT_TIME lt; CloseTime вложено в 1 if -е, так что если оно ложное, то не нужно переходить к другому. Я неправильно это понял.

Ответ №2:

Никогда не замечал, что @PROG сказал в первую очередь. Я уже 2 дня чешу в затылке. Теперь я подумал, что давайте попробуем разобраться в его логике. И это сработало как заклинание. Я последовал совету @Salman не запускать задание CRON и загружать активные рестораны по требованию и использовал логику @ProGu, вот как выглядит мой окончательный запрос:

 SELECT * from `restaurant` WHERE (  NOW() gt; STR_TO_DATE(`OpenTime`, '%H:%i')  AND  NOW() lt;  CASE  WHEN STR_TO_DATE(`OpenTime`, '%H:%i') gt; STR_TO_DATE(`CloseTime`, '%H:%i')  THEN DATE_ADD(STR_TO_DATE(`CloseTime`, '%H:%i'), INTERVAL 1 DAY)  ELSE STR_TO_DATE(`CloseTime`, '%H:%i')  END )  

Спасибо, ребята, за отличную помощь. Особая благодарность Салману за написание ответа, который побудил меня оставить работу в cron и сделать ее более эффективной.