SQL Server如何正确查询跨年度的3个月日期区间数据
错误原因
原有日期过滤逻辑存在两处硬伤,直接导致查询结果不符合预期:
- 条件冗余且存在逻辑漏洞:
MONTH(END_DATE)>='11'已经覆盖了11、12月的匹配规则,额外写的MONTH(END_DATE)>='12'完全冗余;同时仅限定YEAR(END_DATE)>='2022',没有对1月、2月数据的所属年份做约束,最终所有2022年及以后的1月、11月、12月数据都会被返回,自然会出现2023年11月、12月的错误结果。 - 范围匹配逻辑错误:目标是筛选两个固定的连续3个月时间窗,原逻辑只是零散判断月份值和年份下限,无法精准匹配跨年度的连续时间范围。
修正后的SQL(适配SQL Server)
不推荐在WHERE条件中对日期字段使用MONTH()、YEAR()等函数,数据量大时会导致字段上的索引无法生效,查询性能差。直接使用日期区间判断的写法,既精准又能保证性能:
SELECT [date] FROM Table_A a WHERE a.FIDG_FCLT_STATUS IN ('CLSNM','CLSTR','CLSWP','FULTR','OPRTN','PARTR','TINPR') AND a.PARAMETER_TYPE = 'FIC' AND ( -- 匹配第一个区间:2022年11月-2023年1月 (END_DATE >= '2022-11-01' AND END_DATE < '2023-02-01') OR -- 匹配第二个区间:2022年12月-2023年2月 (END_DATE >= '2022-12-01' AND END_DATE < '2023-03-01') ) ORDER BY END_DATE
写法说明:区间上限使用次月1日的小于判断,而非当月最后一天的小于等于判断,是为了兼容
END_DATE带时分秒的场景,避免遗漏当月最后一天非0点的时间数据。
后续如果需要调整查询的时间窗,直接替换区间内的起止日期即可,不需要调整月份、年份的判断规则,不会出现跨年度匹配错误的问题。
内容的提问来源于stack exchange,提问作者Rizky Albert Hartono
相关产品推荐
相关产品推荐

