检查时间是今天还是明天
Check if time is today or tomorrow
在 MySQL 中,我在 restaurant
table 中有三列(IsActive
、OpenTime
和 CloseTime
)。我添加了一个 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 工作并使其更有效率。
在 MySQL 中,我在 restaurant
table 中有三列(IsActive
、OpenTime
和 CloseTime
)。我添加了一个 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 工作并使其更有效率。