如何在SQL中基于任意日期创建适配闰年的自定义季度
自定义季度起止日期的SQL实现方案
针对你需要根据任意给定日期生成自定义季度(Q1:3-5月、Q2:6-8月、Q3:9-11月、Q4:12月-次年2月底)起止日期的需求,以下提供主流数据库的具体实现方案,自动适配闰年场景。
MySQL 实现:自定义表值函数
函数定义
DELIMITER // CREATE FUNCTION GetCustomQuarterDates(input_date DATE) RETURNS TABLE ( quarter_num INT, start_date DATE, end_date DATE ) DETERMINISTIC BEGIN DECLARE year_val INT; DECLARE quarter_val INT; DECLARE q_start DATE; DECLARE q_end DATE; SET year_val = YEAR(input_date); -- 判断输入日期所属的自定义季度 SET quarter_val = CASE WHEN MONTH(input_date) BETWEEN 3 AND 5 THEN 1 WHEN MONTH(input_date) BETWEEN 6 AND 8 THEN 2 WHEN MONTH(input_date) BETWEEN 9 AND 11 THEN 3 ELSE 4 END; -- 生成对应季度的起止日期 CASE quarter_val WHEN 1 THEN SET q_start = CONCAT(year_val, '-03-01'); SET q_end = CONCAT(year_val, '-05-31'); WHEN 2 THEN SET q_start = CONCAT(year_val, '-06-01'); SET q_end = CONCAT(year_val, '-08-31'); WHEN 3 THEN SET q_start = CONCAT(year_val, '-09-01'); SET q_end = CONCAT(year_val, '-11-30'); WHEN 4 THEN SET q_start = CONCAT(year_val, '-12-01'); -- LAST_DAY自动处理闰年,返回次年2月最后一天 SET q_end = LAST_DAY(CONCAT(year_val + 1, '-02-01')); END CASE; RETURN QUERY SELECT quarter_val, q_start, q_end; END // DELIMITER ;
使用示例
-- 查询2023-03-28所属的自定义季度起止日期 SELECT * FROM GetCustomQuarterDates('2023-03-28'); -- 查询2023-12-15所属的自定义季度(自动适配闰年,结束日期为2024-02-29) SELECT * FROM GetCustomQuarterDates('2023-12-15');
SQL Server 实现:自定义表值函数
函数定义
CREATE FUNCTION dbo.GetCustomQuarterDates(@input_date DATE) RETURNS @result TABLE ( quarter_num INT, start_date DATE, end_date DATE ) AS BEGIN DECLARE @year_val INT = YEAR(@input_date); DECLARE @quarter_val INT; DECLARE @q_start DATE; DECLARE @q_end DATE; -- 判断输入日期所属的自定义季度 SET @quarter_val = CASE WHEN MONTH(@input_date) BETWEEN 3 AND 5 THEN 1 WHEN MONTH(@input_date) BETWEEN 6 AND 8 THEN 2 WHEN MONTH(@input_date) BETWEEN 9 AND 11 THEN 3 ELSE 4 END; -- 生成季度起始日期 SELECT @q_start = CASE @quarter_val WHEN 1 THEN DATEFROMPARTS(@year_val, 3, 1) WHEN 2 THEN DATEFROMPARTS(@year_val, 6, 1) WHEN 3 THEN DATEFROMPARTS(@year_val, 9, 1) WHEN 4 THEN DATEFROMPARTS(@year_val, 12, 1) END; -- 生成季度结束日期 SELECT @q_end = CASE @quarter_val WHEN 1 THEN DATEFROMPARTS(@year_val, 5, 31) WHEN 2 THEN DATEFROMPARTS(@year_val, 8, 31) WHEN 3 THEN DATEFROMPARTS(@year_val, 11, 30) WHEN 4 THEN EOMONTH(DATEFROMPARTS(@year_val + 1, 2, 1)) END; INSERT INTO @result VALUES (@quarter_val, @q_start, @q_end); RETURN; END;
使用示例
-- 查询2023-03-28所属的自定义季度起止日期 SELECT * FROM dbo.GetCustomQuarterDates('2023-03-28'); -- 查询2023-12-15所属的自定义季度(自动适配闰年,结束日期为2024-02-29) SELECT * FROM dbo.GetCustomQuarterDates('2023-12-15');
核心逻辑说明
- 季度判断:通过
MONTH()函数提取输入日期的月份,匹配自定义季度区间确定所属季度 - 日期生成:
- Q1-Q3的起止日期直接使用固定天数的月份,无需额外处理
- Q4的结束日期依赖
LAST_DAY(MySQL)或EOMONTH(SQL Server)函数,自动识别闰年并返回正确的2月最后一天
- 通用性:支持任意
DATE类型输入,自动处理Q4跨年场景
内容的提问来源于stack exchange,提问作者cr7oo
相关产品推荐
相关产品推荐

