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

如何在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');

核心逻辑说明

  1. 季度判断:通过MONTH()函数提取输入日期的月份,匹配自定义季度区间确定所属季度
  2. 日期生成:
    • Q1-Q3的起止日期直接使用固定天数的月份,无需额外处理
    • Q4的结束日期依赖LAST_DAY(MySQL)或EOMONTH(SQL Server)函数,自动识别闰年并返回正确的2月最后一天
  3. 通用性:支持任意DATE类型输入,自动处理Q4跨年场景

内容的提问来源于stack exchange,提问作者cr7oo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 12:35:24