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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 03:02:05