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

MySQL如何使用LIKE实现两日期列区间匹配年度重复提醒查询

MySQL 年度循环/普通日期区间提醒查询实现

核心逻辑

不需要用LIKE做后缀匹配,直接拆分两类提醒的判断规则即可,同时额外覆盖年度区间跨年的边界场景(比如每年12月30日到次年1月2日的循环提醒):

  • 非年度提醒(yearly=0):直接用完整日期做区间匹配
  • 年度提醒(yearly=1):忽略年份,提取所有日期的月日部分做区间判断,分跨年、不跨年两种子场景处理

实现代码

用MySQL内置的DATE_FORMAT(日期, '%m%d')函数提取日期的4位定长月日字符串(格式为MMDD,比如6月15日返回0615),定长字符串比较的稳定性远高于LIKE后缀匹配。

-- 1. 定义需要查询的目标日期,比如要查2022-06-15生效的提醒
SET @query_date = '2022-06-15';
-- 2. 提前提取查询日期的月日部分,避免重复计算
SET @query_md = DATE_FORMAT(@query_date, '%m%d');

SELECT * FROM reminders
WHERE
  -- 匹配非年度提醒
  (
    yearly = 0 
    AND @query_date BETWEEN `date` AND `date_to`
  )
  OR
  -- 匹配年度循环提醒
  (
    yearly = 1
    AND (
      -- 子场景1:年度区间不跨年,比如6月14日-6月16日
      (
        DATE_FORMAT(`date`, '%m%d') <= DATE_FORMAT(`date_to`, '%m%d')
        AND @query_md BETWEEN DATE_FORMAT(`date`, '%m%d') AND DATE_FORMAT(`date_to`, '%m%d')
      )
      OR
      -- 子场景2:年度区间跨年,比如12月30日-次年1月2日
      (
        DATE_FORMAT(`date`, '%m%d') > DATE_FORMAT(`date_to`, '%m%d')
        AND (
          @query_md >= DATE_FORMAT(`date`, '%m%d')
          OR @query_md <= DATE_FORMAT(`date_to`, '%m%d')
        )
      )
    )
  );

效果验证

针对给出的测试数据:

datedate_toyearly
2021-06-142021-06-161
2022-05-032022-05-040

传入查询日期2022-06-15时:

  • 第一条年度提醒的月日区间为0614-0616,查询日月日0615落在区间内,命中
  • 第二条非年度提醒的完整日期区间为2022-05-03-2022-05-04,查询日期不在区间内,不命中
    最终返回结果完全符合预期。

注意事项

不要用LIKE '%%-06-15'这类写法做匹配:

  • 字符串后缀匹配无法直接处理区间判断逻辑
  • 一旦日期字段出现非法格式值,LIKE匹配容易出现误判
  • 无法自动处理跨年的年度循环提醒场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 23:16:01