检查时间是今天还是明天

Check if time is today or tomorrow

在 MySQL 中,我在 restaurant table 中有三列(IsActiveOpenTimeCloseTime)。我添加了一个 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') < NOW()
  )
  OR
  (
    IsActive = 1
    AND
    STR_TO_DATE(CONCAT(CURDATE(), ' ', `CloseTime`), '%Y-%m-%d %H:%i') < NOW()
  )

一切正常,但当截止日期为第二天时逻辑失败,如您所知,在 11:59PM 之后是第二天,但在 STR_TO_DATE(CONCAT(CURDATE(), ' ', OpenTime), '%Y-%m-%d %H:%i') 中,CURDATE() 是今天并且我不知道第二天怎么办。因此,只要 CRON 运行,第一行就会切换为 1 和 0。因为今天1:00比现在时间还早

检查当前时间是否在两个时间之间(可能在午夜的另一边)的逻辑很简单:

  • 如果 OpenTime <= CloseTime 那么检查 OpenTime <= CURRENT_TIME 并且 CURRENT_TIME < CloseTime
  • 否则检查 OpenTime <= CURRENT_TIME 或 CURRENT_TIME < CloseTime

也就是说,您不需要活动列。按需查询活跃餐厅即可。

一开始没注意到@ProGu 说了什么。我已经挠头两天了。现在我想让我们试试他的逻辑。它就像一个魅力。我听从了@Salman 的建议,不要 运行 CRON 作业并按需加载活跃的餐厅并使用了@ProGu 逻辑,这是我的最终查询:

SELECT * from `restaurant`
WHERE
(
  NOW() > STR_TO_DATE(`OpenTime`, '%H:%i')
  AND
  NOW() <
    CASE
      WHEN STR_TO_DATE(`OpenTime`, '%H:%i') > 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
)

感谢大家的大力帮助。特别感谢 Salman 写下答案,这促使我离开 cron 工作并使其更有效率。