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

标签 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 <= 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/

相关文章:

java - 在 JTable 中显示图像

mysql - Playframework Hibernate JPA 无法连接到数据库

PHP 如果日期 >13 天前

mysql - Lucene.NET索引实时更新

mysql - SQL 从两个表中选择总价,使用一种语法有两个条件

mysql - 可以利用多个 'range' 列上的索引吗?

mysql - SQL:一对多,其中多个关系之一有两个特定值

java - 在Java中处理多个过滤器-MySql

mysql - 将 IN 参数存储在存储过程的变量中

mysql select *Where 并从一个字段获取服装行