我阅读了如何在两个日期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&lt; = 4不是这样的。
我正在考虑看看我是否可以转换NOW(),开始并结束时间戳以允许我对它们进行比较,但是对这个想法不以为然,因为我可能会有一些开始日期为2000-12-26和结束日期是2000-01-01(记住我忽略了这一年)。
是否有更好的方法来存储月/日对而不是日期?或者我该怎么做才能修复我的数据库查询?
答案 0 :(得分:1)
在比较开始日期和结束日期之前,必须将当前日期调整回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()cos NOW()具有不需要的时间组件。
答案 1 :(得分:0)
SELECT * FROM table WHERE CURDATE() between dateStart and dateEnd
其中dateStart
是您的过去日期,dateEnd
是您的未来日期