SQL查询WHERE子句使用日期范围时结果集缺失正确日期问题求助
问题根因
你遇到的9月30日数据缺失,核心是datetime类型的时间精度匹配问题:
EOMONTH()函数返回的日期默认时间为00:00:00.000,例如查询9月最后一天时,返回值为2024-09-30 00:00:00.000- 你的
TA_DUE_DATE字段带有时分秒属性,9月30日0点之后产生的所有数据(例如2024-09-30 08:12:33)都会大于这个返回值,所以被<= EOMONTH(@date2)条件过滤掉。
修复方案
推荐使用半开区间日期写法,无需考虑时间精度问题,也可以简化你原有变量逻辑:
- 直接删除原有
@date1、@date2变量声明赋值逻辑,你设置的getdate()-15逻辑可以被更稳定的日期函数替代,只要查询是在当月前15天运行,以下条件可以稳定取到上月全量数据 - 将WHERE子句中的日期过滤条件替换为:
A.TA_DUE_DATE >= DATEADD(DAY, 1, EOMONTH(GETDATE(), -2)) AND A.TA_DUE_DATE < DATEADD(DAY, 1, EOMONTH(GETDATE(), -1))
逻辑说明
DATEADD(DAY, 1, EOMONTH(GETDATE(), -2)):计算上上月最后一天加1天,即上月第一天0点DATEADD(DAY, 1, EOMONTH(GETDATE(), -1)):计算上月最后一天加1天,即当月第一天0点
所有上月的时间数据(哪怕是上月最后一天23:59:59.999)都会小于当月第一天0点,不会出现边缘数据漏匹配的问题,兼容性比<=写法更好。
额外校验点
如果修改后仍有问题,可以检查两个字段的一致性:你SELECT输出的是TA_DUE_DATEUTC(UTC时区日期),但WHERE过滤用的是TA_DUE_DATE,如果两个字段时区不统一,也可能出现日期匹配偏差。
内容的提问来源于stack exchange,提问作者Nick Singh Sahota
相关产品推荐
相关产品推荐

