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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 06:06:47