如何用当前日期查询tbl_announcements表中日期区间内的记录?
嘿,这个需求其实很容易实现,核心就是用SQL的日期比较逻辑,结合你使用的数据库的当前日期/时间函数就行。我分两种常见场景给你说明:
场景1:只判断日期部分是否在区间内(忽略具体时间)
如果你的需求是只要当前日期落在from和to的日期范围内,不管当天的具体时间——比如今天是2018-01-28,哪怕某条记录的from是2018-01-28 14:02:00,to是2018-01-29 16:02:00,这条记录也需要被筛选出来。
不同数据库的写法:
MySQL/MariaDB:
SELECT * FROM tbl_announcements WHERE DATE(`from`) <= CURDATE() AND DATE(`to`) >= CURDATE();这里
DATE()函数用来提取datetime字段的日期部分,CURDATE()获取当前系统日期(不带时间)。另外注意from是SQL关键字,所以用反引号括起来避免语法错误。SQL Server:
SELECT * FROM tbl_announcements WHERE CAST([from] AS DATE) <= CAST(GETDATE() AS DATE) AND CAST([to] AS DATE) >= CAST(GETDATE() AS DATE);用
CAST()把datetime字段转成DATE类型,GETDATE()获取当前时间后再转成日期。这里用方括号括起关键字from。PostgreSQL:
SELECT * FROM tbl_announcements WHERE DATE("from") <= CURRENT_DATE AND DATE("to") >= CURRENT_DATE;
场景2:判断当前精确时间是否在区间内
如果需要严格匹配当前时间点是否处于from和to的datetime区间内——比如现在是2018-01-28 10:00:00,只有from≤这个时间且to≥这个时间的记录才被选中,写法更直接:
MySQL/MariaDB:
SELECT * FROM tbl_announcements WHERE `from` <= NOW() AND `to` >= NOW();NOW()获取当前系统的datetime(带时分秒)。SQL Server:
SELECT * FROM tbl_announcements WHERE [from] <= GETDATE() AND [to] >= GETDATE();PostgreSQL:
SELECT * FROM tbl_announcements WHERE "from" <= CURRENT_TIMESTAMP AND "to" >= CURRENT_TIMESTAMP;
小提示
不管哪种场景,确保你的from和to字段是datetime/timestamp类型,这样日期比较才会准确。如果是字符串类型的话,需要先转成日期类型再比较(比如MySQL用STR_TO_DATE()),不过建议数据库里直接存日期类型更规范。
内容的提问来源于stack exchange,提问作者Beginner

