查询数据库以查看现在是否在两个日期之间

时间:2018-04-11 06:24:10

标签: mysql

我阅读了如何在两个日期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(记住我忽略了这一年)。

是否有更好的方法来存储月/日对而不是日期?或者我该怎么做才能修复我的数据库查询?

2 个答案:

答案 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是您的未来日期