SQL BETWEEN日期查询AM到PM失效及记录不符问题求助
嘿,咱们一步步解决你的这两个SQL Server datetime问题——这些都是非常常见的坑,你不是一个人在踩!
问题1:BETWEEN查询结果远少于预期
你遇到的核心问题是BETWEEN GETDATE() AND GETDATE()+15的范围定义和你的预期不匹配。
为什么会这样?
GETDATE()+15确实是当前时间加15天,但它保留了精确的时分秒(比如你例子里的10:24:44.747)。这意味着任何LoginDate在15天后的同一时刻之后的记录都会被排除(比如2018-04-12 11:00:00的记录就不在范围内)。而你预期的“未来15天”应该是包含15天后一整天的所有时间,对吧?- 另外,虽然SQL Server通常会把
GETDATE()作为常量计算一次,但用BETWEEN处理datetime范围时,更推荐用>=和<来明确边界,避免因时间精度导致的遗漏(毕竟datetime有3毫秒的精度,BETWEEN可能会漏掉最后几毫秒的记录)。
解决方法:
根据你的需求选择对应的写法:
- 如果你想包含**从当前时间开始,到15天后当天结束(23:59:59.997)**的所有记录:
SELECT * FROM employee WHERE Logindate >= GETDATE() AND Logindate < DATEADD(DAY, 16, CAST(GETDATE() AS DATE))
这里CAST(GETDATE() AS DATE)会去掉时间部分得到当前日期,加16天后得到15天后的下一天的0点,用<就完美包含了15天后的所有时间。
- 如果你想包含从今天0点开始,到15天后当天结束的所有记录:
SELECT * FROM employee WHERE Logindate >= CAST(GETDATE() AS DATE) AND Logindate < DATEADD(DAY, 16, CAST(GETDATE() AS DATE))
问题2:查询LoginDate处于AM/PM时段的记录
要筛选一天中的特定时段,关键是提取LoginDate的时间部分进行比较,SQL Server有几种简单直观的方式:
方式1:用DATEPART提取小时
- 筛选所有**AM时段(00:00-11:59)**的记录:
SELECT * FROM employee WHERE DATEPART(HOUR, Logindate) < 12
- 筛选所有**PM时段(12:00-23:59)**的记录:
SELECT * FROM employee WHERE DATEPART(HOUR, Logindate) >= 12
方式2:转换为TIME类型直接比较(更直观)
如果你要筛选具体的时段(比如早上9点到下午5点),这种方式可读性更强:
SELECT * FROM employee WHERE CAST(Logindate AS TIME) BETWEEN '09:00:00' AND '17:00:00'
如果需要包含17:00之后的分钟(比如到17:30),直接调整时间值即可:
SELECT * FROM employee WHERE CAST(Logindate AS TIME) BETWEEN '09:00:00' AND '17:30:00'
小提示:
如果你的LoginDate有NULL值,这些记录会自动被排除在查询结果外,如果你需要包含的话,要加上OR Logindate IS NULL。
内容的提问来源于stack exchange,提问作者Kumee
相关产品推荐
相关产品推荐

