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
相关产品推荐
相关产品推荐

