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') ) ) ) );
效果验证
针对给出的测试数据:
| date | date_to | yearly |
|---|---|---|
| 2021-06-14 | 2021-06-16 | 1 |
| 2022-05-03 | 2022-05-04 | 0 |
传入查询日期2022-06-15时:
- 第一条年度提醒的月日区间为
0614-0616,查询日月日0615落在区间内,命中 - 第二条非年度提醒的完整日期区间为
2022-05-03-2022-05-04,查询日期不在区间内,不命中
最终返回结果完全符合预期。
注意事项
不要用LIKE '%%-06-15'这类写法做匹配:
- 字符串后缀匹配无法直接处理区间判断逻辑
- 一旦日期字段出现非法格式值,
LIKE匹配容易出现误判 - 无法自动处理跨年的年度循环提醒场景
内容的提问来源于stack exchange,提问作者miitchel
相关产品推荐
相关产品推荐

