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

MySQL SELECT语句WHERE子句中嵌入IF条件实现日期范围查询

解决跨年度/跨月份的日期范围筛选问题

我明白你现在的困扰——直接对年、月、日字段分别用>=和<=会导致逻辑漏洞,比如当你要筛选2023年10月5日到2024年2月15日的数据时,原语句会错误包含2023年1-9月、2024年3-12月的记录。咱们可以按年份是否相同、月份是否相同的逻辑分层处理,写出准确的WHERE条件:

SELECT COUNT(*) 
FROM SOMT_Development.Board_Metrics_Data bmd
WHERE 
    -- 情况1:起始年份和结束年份相同
    (
        bmd.Metric_Year = startYear 
        AND bmd.Metric_Year = endYear
        AND (
            -- 起始月份 < 当前月份 < 结束月份:直接符合
            (bmd.Metric_Month > startMonth AND bmd.Metric_Month < endMonth)
            -- 等于起始月份:日期需 >= 起始日
            OR (bmd.Metric_Month = startMonth AND bmd.Metric_Day >= startDay)
            -- 等于结束月份:日期需 <= 结束日
            OR (bmd.Metric_Month = endMonth AND bmd.Metric_Day <= endDay)
        )
    )
    OR
    -- 情况2:起始年份 < 结束年份(中间年份的所有数据都符合)
    (
        bmd.Metric_Year > startYear 
        AND bmd.Metric_Year < endYear
    )
    OR
    -- 情况3:等于起始年份,且月份在起始月及以后
    (
        bmd.Metric_Year = startYear
        AND (
            -- 起始月份 < 当前月份:直接符合
            bmd.Metric_Month > startMonth
            -- 等于起始月份:日期 >= 起始日
            OR (bmd.Metric_Month = startMonth AND bmd.Metric_Day >= startDay)
        )
    )
    OR
    -- 情况4:等于结束年份,且月份在结束月及以前
    (
        bmd.Metric_Year = endYear
        AND (
            -- 当前月份 < 结束月份:直接符合
            bmd.Metric_Month < endMonth
            -- 等于结束月份:日期 <= 结束日
            OR (bmd.Metric_Month = endMonth AND bmd.Metric_Day <= endDay)
        )
    )

逻辑拆解:

  • 情况1:当年份完全相同时,只需要确保月份在范围内,且对应月份的日期符合要求
  • 情况2:当年份在起始和结束之间时,所有月份的数据都符合条件,无需额外判断月日
  • 情况3:处理起始年份中,从起始月开始到年底的数据
  • 情况4:处理结束年份中,从年初到结束月的数据

这样分层判断后,就能精准筛选出任意两个日期之间的所有数据,不会出现逻辑漏洞。

内容的提问来源于stack exchange,提问作者dom sheratte

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:17:30