使用DATEPART筛选≥2021的记录却返回2019、2020数据?原因何在?
问题原因分析
你的WHERE子句存在一个关键逻辑错误:DATEPART(year, 2021) 的写法不符合预期。
DATEPART 函数的第二个参数要求是日期/时间类型,但你直接传入了整数2021,SQL Server会自动将这个整数隐式转换为DATETIME类型。转换规则是:整数代表从1900-01-01开始计算的天数,2021天对应的日期是1905-06-16,因此DATEPART(year, 2021)实际返回的是1905。
这就导致你的WHERE条件等价于:
DATEPART(year, Cast(ss.[dateTime] as date)) >= 1905
显然所有年份大于等于1905的记录都会被筛选出来,自然包含2019、2020年的数据。
正确写法示例
直接比较年份值
select top 10 DATEPART(year, ss.[dateTime]) from states ss where DATEPART(year, ss.[dateTime]) >= 2021
更高效的写法(支持索引使用)
如果dateTime列有索引,建议用范围查询避免函数包裹列,这样能利用索引提升性能:
select top 10 DATEPART(year, ss.[dateTime]) from states ss where ss.[dateTime] >= '2021-01-01'
内容的提问来源于stack exchange,提问作者testy
相关产品推荐
相关产品推荐

