You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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可能会漏掉最后几毫秒的记录)。

解决方法:

根据你的需求选择对应的写法:

  1. 如果你想包含**从当前时间开始,到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天后的所有时间。

  1. 如果你想包含从今天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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:32:06