首页/数据/SQL 速查/日期范围查询的边界写法
函数速查60 条

日期范围查询的边界写法

按时间过滤推荐半开区间 [起点, 次日):用 < 下月 1 日 而不是 BETWEEN ... 月末 23:59:59,避免漏掉毫秒数据。

SQL 速查数据更新于 2026-10-12

推荐写法

推荐写法
-- 2024 年 6 月整月(含毫秒)
SELECT * FROM orders
WHERE created_at >= '2024-06-01'
  AND created_at <  '2024-07-01';

常见错误

常见错误
-- 会漏掉 6-30 的带时间数据(且 BETWEEN 对 DATETIME 是闭区间)
SELECT * FROM orders
WHERE created_at BETWEEN '2024-06-01' AND '2024-06-30';
为什么DATETIME 带时分秒,'2024-06-30' 等价于 00:00:00,当天其余时间全被排除
秒/毫秒列同上;< 下一整天 一劳永逸
索引范围条件可走 B+ 树索引(created_at 上建索引)
若列是 DATE 类型,BETWEEN a AND b 是安全的;问题只出在带时间的 DATETIME/TIMESTAMP 上。

易错点

  • 把月末写成 BETWEEN '2024-06-01' AND '2024-06-31':6 月没有 31 日,字符串比较虽然不报错但语义已偏
  • 时区混用下按“天”过滤要指定时区换算,否则跨时区服务会漏掉/多算首尾小时

数据来源与参考

  • MySQL 8.0 Reference Manual · Date and Time Functions
  • PostgreSQL Documentation · Date/Time Functions and Operators
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌