MariaDB:同一年份下当前日期的下一条假期记录查询问题
解决方案:获取跨年度的下一条假期记录
你的核心问题是表中的假期记录年份固定,当当前日期处于年末时,次年1月的假期因为年份小于当前年份,会被判定为已过期。解决思路是将固定年份的假期日期转换为「最近未来的对应日期」,再基于这个转换后的日期排序取最近的一条。
方法一:基于月日比较构造未来日期
使用DATE_FORMAT提取假期的月日部分,结合当前年份或下一年份构造新的日期,再按这个日期排序:
SELECT * FROM holidays ORDER BY CASE -- 如果假期的月日晚于等于当前日期的月日,用当前年份 WHEN DATE_FORMAT(date, '%m-%d') >= DATE_FORMAT(CURDATE(), '%m-%d') THEN STR_TO_DATE(CONCAT(YEAR(CURDATE()), '-', DATE_FORMAT(date, '%m-%d')), '%Y-%m-%d') -- 否则用下一年份 ELSE STR_TO_DATE(CONCAT(YEAR(CURDATE()) + 1, '-', DATE_FORMAT(date, '%m-%d')), '%Y-%m-%d') END LIMIT 1;
方法二:基于年日数比较调整年份
利用DAYOFYEAR获取日期在当年的天数,判断假期的年日数是否晚于当前日期,再调整年份:
SELECT * FROM holidays ORDER BY IF( DAYOFYEAR(date) >= DAYOFYEAR(CURDATE()), -- 假期年日数晚于当前,将假期年份替换为当前年份 DATE_ADD(date, INTERVAL (YEAR(CURDATE()) - YEAR(date)) YEAR), -- 否则替换为下一年份 DATE_ADD(date, INTERVAL (YEAR(CURDATE()) - YEAR(date) + 1) YEAR) ) LIMIT 1;
原理说明
两种方法本质都是忽略表中假期的原始年份,只保留月日信息,然后根据当前日期的月日/年日数,判断该假期是在当年剩余时间还是下一年,构造出真实的未来假期日期,最后按这个构造后的日期排序,取第一条就是最近的下一个假期。
这样无论当前是12月还是其他月份,都能正确匹配到下一条假期记录。
内容的提问来源于stack exchange,提问作者Alex27
相关产品推荐
相关产品推荐

