求MySQL查询:获取当前/下一季度指定日期对应星期的最后出现日期
解决方案:动态获取季度内指定星期几的最后出现日期(含跨季度处理)
以下是符合需求的MySQL查询语句,它会自动匹配给定日期的星期几,并在给定日期晚于当前季度目标日期时自动切换到下一季度:
SET @input_date = '2025-12-29'; -- 替换为你的目标日期 SELECT @input_date AS given_date, -- 动态获取给定日期的星期几(0=周一,6=周日) WEEKDAY(@input_date) AS target_weekday, -- 计算当前季度的最后一天 DATE_ADD(DATE_SUB(@input_date, INTERVAL (QUARTER(@input_date)-1)*3 MONTH), INTERVAL 3 MONTH - 1 DAY) AS current_quarter_end, -- 计算当前季度中该星期几的最后出现日期 DATE_SUB( DATE_ADD(DATE_SUB(@input_date, INTERVAL (QUARTER(@input_date)-1)*3 MONTH), INTERVAL 3 MONTH - 1 DAY), INTERVAL (WEEKDAY(DATE_ADD(DATE_SUB(@input_date, INTERVAL (QUARTER(@input_date)-1)*3 MONTH), INTERVAL 3 MONTH - 1 DAY)) - WEEKDAY(@input_date) + 7) % 7 DAY ) AS current_quarter_target, -- 计算下一季度的最后一天 DATE_ADD( DATE_ADD(DATE_SUB(@input_date, INTERVAL (QUARTER(@input_date)-1)*3 MONTH), INTERVAL 3 MONTH - 1 DAY), INTERVAL 3 MONTH ) AS next_quarter_end, -- 计算下一季度中该星期几的最后出现日期 DATE_SUB( DATE_ADD( DATE_ADD(DATE_SUB(@input_date, INTERVAL (QUARTER(@input_date)-1)*3 MONTH), INTERVAL 3 MONTH - 1 DAY), INTERVAL 3 MONTH ), INTERVAL (WEEKDAY(DATE_ADD( DATE_ADD(DATE_SUB(@input_date, INTERVAL (QUARTER(@input_date)-1)*3 MONTH), INTERVAL 3 MONTH - 1 DAY), INTERVAL 3 MONTH )) - WEEKDAY(@input_date) + 7) % 7 DAY ) AS next_quarter_target, -- 最终输出:判断是否需要切换到下一季度 CASE WHEN @input_date > DATE_SUB( DATE_ADD(DATE_SUB(@input_date, INTERVAL (QUARTER(@input_date)-1)*3 MONTH), INTERVAL 3 MONTH - 1 DAY), INTERVAL (WEEKDAY(DATE_ADD(DATE_SUB(@input_date, INTERVAL (QUARTER(@input_date)-1)*3 MONTH), INTERVAL 3 MONTH - 1 DAY)) - WEEKDAY(@input_date) + 7) % 7 DAY ) THEN DATE_SUB( DATE_ADD( DATE_ADD(DATE_SUB(@input_date, INTERVAL (QUARTER(@input_date)-1)*3 MONTH), INTERVAL 3 MONTH - 1 DAY), INTERVAL 3 MONTH ), INTERVAL (WEEKDAY(DATE_ADD( DATE_ADD(DATE_SUB(@input_date, INTERVAL (QUARTER(@input_date)-1)*3 MONTH), INTERVAL 3 MONTH - 1 DAY), INTERVAL 3 MONTH )) - WEEKDAY(@input_date) + 7) % 7 DAY ) ELSE DATE_SUB( DATE_ADD(DATE_SUB(@input_date, INTERVAL (QUARTER(@input_date)-1)*3 MONTH), INTERVAL 3 MONTH - 1 DAY), INTERVAL (WEEKDAY(DATE_ADD(DATE_SUB(@input_date, INTERVAL (QUARTER(@input_date)-1)*3 MONTH), INTERVAL 3 MONTH - 1 DAY)) - WEEKDAY(@input_date) + 7) % 7 DAY ) END AS final_result;
核心改进点说明
动态匹配星期几
直接用WEEKDAY(@input_date)获取给定日期对应的星期几(0=周一,6=周日),替代原代码中硬编码的目标星期,无需手动指定。自动处理跨季度逻辑
- 先计算当前季度的最后一天,再推导该季度内目标星期几的最后出现日期
- 通过
CASE语句判断给定日期是否晚于当前季度的目标日期:如果是,则自动计算并返回下一季度的目标日期;否则返回当前季度的结果。
通用化季度最后一天计算
用DATE_ADD(DATE_SUB(@input_date, INTERVAL (QUARTER(@input_date)-1)*3 MONTH), INTERVAL 3 MONTH - 1 DAY)自动计算任意日期所在季度的最后一天,无需分季度写死3/31、6/30等日期,避免闰年或日期错误。
示例验证
- 当输入日期为
2025-02-10时,当前季度目标日期为2025-03-31,给定日期早于该值,最终输出2025-03-31 - 当输入日期为
2025-04-10时,当前季度目标日期为2025-06-26,给定日期早于该值,最终输出2025-06-26 - 当输入日期为
2025-12-29时,当前季度目标日期就是2025-12-29,给定日期不早于该值,最终输出下一季度的目标日期2026-03-30
内容的提问来源于stack exchange,提问作者rMafia
相关产品推荐
相关产品推荐

