是否存在类似EODAY(GETDATE())的函数获取当日结束时间?
SQL日期范围查询:当日结束时间的处理方案
有没有直接返回YYYY-MM-DD 23:59:59的内置函数?
大部分主流SQL数据库都没有现成的EODAY这类函数,需要手动构造,不同数据库方言的写法有区别:
- SQL Server:
逻辑是先把当前时间转成纯日期(去掉时分秒),加1天得到次日0点,再减1秒就得到当日23:59:59。DATEADD(SECOND, -1, DATEADD(DAY, 1, CAST(GETDATE() AS DATE))) - MySQL:
DATE_SUB(DATE_ADD(CURDATE(), INTERVAL 1 DAY), INTERVAL 1 SECOND) - PostgreSQL:
CURRENT_DATE + INTERVAL '1 day' - INTERVAL '1 second'
但要注意:这种写法存在精度隐患——如果你的datetime字段支持毫秒/微秒(比如SQL Server的datetime2、PostgreSQL的timestamp),23:59:59之后的时间(比如23:59:59.123)会被漏掉,因为它比23:59:59大,但实际上仍属于当天。
为什么业内更推荐用< 次日00:00:00的写法?
这是更稳妥的方案,比如你要查询2023-03-10到2023-03-13的所有记录,应该这么写:
WHERE your_datetime_column >= '2023-03-10' AND your_datetime_column < '2023-03-14'
优势很明显:
- 无精度遗漏:不管字段精度是秒、毫秒还是微秒,所有属于2023-03-13的时间都会被包含,不会漏掉任何一条符合条件的记录。
- 索引友好:这种写法能让数据库正常使用
your_datetime_column上的索引,如果用函数处理字段(比如CAST(your_datetime_column AS DATE) <= '2023-03-13'),大概率会导致索引失效,拖慢查询速度。
非要用当日结束时间怎么办?
如果业务场景必须用到23:59:59这类格式,需要对应字段的精度来构造:
比如SQL Server的datetime类型精度是3.33毫秒,最后一个有效时间点是23:59:59.997,这时要这么写:
DATEADD(MILLISECOND, -3, DATEADD(DAY, 1, CAST(GETDATE() AS DATE)))
但还是强烈建议优先用< 次日的写法,既安全又高效。
内容的提问来源于stack exchange,提问作者On The Net Again
相关产品推荐
相关产品推荐

