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

Teradata中展开起止日期间月份的SQL查询需求

在Teradata中展开日期区间内的所有月份

针对你需要将起始日期到结束日期之间的所有月份拆分为单独行的需求,这里提供两种在Teradata中实现的SQL方案:

方案1:递归CTE实现(通用无依赖)

递归CTE是最灵活的方式,不需要依赖系统表,适合任意场景:

WITH input_data AS (
    -- 模拟你的示例数据,实际使用时替换为你的表名和字段
    SELECT 
        300 AS id,
        DATE '2021-08-20' AS start_dt,
        DATE '2021-10-25' AS end_dt
),
recursive_months AS (
    SELECT 
        id,
        TRUNC(start_dt, 'MONTH') AS current_month_start,
        end_dt
    FROM input_data
    UNION ALL
    SELECT 
        id,
        ADD_MONTHS(current_month_start, 1),
        end_dt
    FROM recursive_months
    -- 递归终止条件:当前月份不超过结束日期的月份
    WHERE current_month_start < TRUNC(end_dt, 'MONTH')
)
SELECT 
    id,
    TO_CHAR(current_month_start, 'MM/YYYY') AS month_year
FROM recursive_months
ORDER BY id, current_month_start;

代码说明:

  • input_data:替换为你的实际业务表,若原始日期是字符串类型,可通过CAST('08/20/2021' AS DATE FORMAT 'MM/DD/YYYY')转换为Teradata的DATE类型
  • TRUNC(start_dt, 'MONTH'):提取日期所在月份的第一天,确保从当月起始开始计算区间
  • ADD_MONTHS:实现月份的递增逻辑
  • 最终用TO_CHAR将日期格式化为MM/YYYY的目标形式

方案2:利用系统日历表sys_calendar.calendar

Teradata自带的sys_calendar.calendar表包含完整日期数据,处理批量数据时效率更高:

WITH input_data AS (
    SELECT 
        300 AS id,
        DATE '2021-08-20' AS start_dt,
        DATE '2021-10-25' AS end_dt
)
SELECT DISTINCT
    d.id,
    TO_CHAR(c.calendar_date, 'MM/YYYY') AS month_year
FROM input_data d
JOIN sys_calendar.calendar c
    ON c.calendar_date BETWEEN TRUNC(d.start_dt, 'MONTH') AND TRUNC(d.end_dt, 'MONTH')
ORDER BY d.id, month_year;

代码说明:

  • 通过关联系统日历表,筛选出起始月份到结束月份之间的所有日期
  • 用DISTINCT去重,每个月份仅保留一条记录
  • 同样通过TO_CHAR格式化输出目标格式

注意事项:

两种方案均支持跨年度日期区间,比如起始日期为2021-11-15、结束日期为2022-02-20时,会自动生成11/2021、12/2021、01/2022、02/2022这些记录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 11:24:11