我读到了如何在两个日期之间查询 here ,但我正在尝试做相反的事情。我有一个事件数据库,包含开始日期和结束日期。我正在尝试检查 now() 是否位于任何开始日和结束日之间。
值得注意的是,我的事件是周期性的,所以我不关心年份。为了在我的数据库中使用数据格式,我只使用 2000 来表示所有内容。我有圣诞节(2000-12-01 到 2000-12-25)、独立日(2000-06-25 到 2000-07-04)等事件。
起初我正在考虑做这样的事情:
SELECT * FROM `table` WHERE MONTH(NOW()) >= MONTH(`start`) AND DATE(NOW()) >= DATE(`start`) AND MONTH(NOW()) <= MONTH(`end`) AND DATE(NOW()) <= DATE(`end`)
但后来我意识到跨越数月的时间段存在一个重大缺陷。如果今天是 27JUN,那么我希望返回独立日行,但当 27 >= 25 时,27 <= 4 则情况并非如此。
我正在考虑是否可以将 NOW()、开始和结束转换为时间戳以允许我比较它们,但我放弃了这个想法,因为我可能有一些开始日期为 2000-12-26 的东西,并且结束日期为 2000-01-01(记住我忽略了年份)。
是否有更好的方法来存储月份/日期对而不是日期?或者我可以做什么来修复我的数据库查询?
最佳答案
在与开始日期和结束日期进行比较之前,必须将当前日期调整回 2000 年。如果结束日期早于开始日期,则结束日期的年份实际上是开始日期之后的年份。试试这个:
SELECT * from `table`
WHERE
(`end` >= `start` AND
DATE_ADD(CURDATE(), INTERVAL 2000-YEAR(CURDATE()) YEAR)
BETWEEN `start` AND `end`)
OR
(`end` < `start` AND
DATE_ADD(CURDATE(), INTERVAL 2000-YEAR(CURDATE()) YEAR)
BETWEEN `start` and DATE_ADD(`end`, INTERVAL 1 YEAR))
或者:
SELECT * from `table`
WHERE
CASE
WHEN `end` >= `start` THEN
DATE_ADD(CURDATE(), INTERVAL 2000-YEAR(CURDATE()) YEAR) BETWEEN `start` AND `end`
ELSE
DATE_ADD(CURDATE(), INTERVAL 2000-YEAR(CURDATE()) YEAR) BETWEEN `start` and DATE_ADD(`end`, INTERVAL 1 YEAR)
END
使用 CURDATE() 而不是 NOW(),因为 NOW() 具有不需要的时间分量。
关于mysql - 查询数据库以查看 Now 是否在两个日期之间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49767909/