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

Oracle SQL财年周数计算咨询:财年始于6月1日,周日为周起始

计算自定义财年周数(财年始于6月1日,周日为周起始)

原公式TO_NUMBER(TO_CHAR(TO_DATE(DATE_ID + 1,'DD-Mon-YY'),'IW')) -21的问题在于:它依赖日历年的IW周数(周一为周起始),当日期跨到下一个日历年时,IW周数会重置为1,导致计算结果出现负数。以下是针对你的规则的解决方案:

解决方案思路

  1. 先将数字类型的DATE_ID转换为标准日期格式,避免格式歧义
  2. 确定当前日期所属的财年起始日(6月1日):
    • 若当前日期月份≥6,财年起始日为当年6月1日
    • 若当前日期月份<6,财年起始日为上一年6月1日
  3. 基于周日为周起始的规则,计算日期在财年中的周数:通过计算当前日期与财年起始日前一个周日的天数差,再转换为周数

完整SQL代码

WITH DATE_WITH_FY AS (
    SELECT
        DATE_ID,
        -- 将数字型日期转为标准日期格式
        TO_DATE(TO_CHAR(DATE_ID), 'YYYYMMDD') AS CAL_DATE,
        -- 计算当前日期所属的财年起始日
        CASE
            WHEN EXTRACT(MONTH FROM TO_DATE(TO_CHAR(DATE_ID), 'YYYYMMDD')) >= 6 
            THEN TRUNC(TO_DATE(TO_CHAR(DATE_ID), 'YYYYMMDD'), 'YYYY') + INTERVAL '5 months'
            ELSE TRUNC(TO_DATE(TO_CHAR(DATE_ID), 'YYYYMMDD'), 'YYYY') - INTERVAL '7 months'
        END AS FY_START_DATE
    FROM DATE_DIM
    WHERE DATE_ID IN (
        20190601,20190602,20190915,
        20191228,20191229,20200101,
        20200601,20200606,20200607
    )
)
SELECT
    DATE_ID,
    -- 计算财年周数
    FLOOR(
        (CAL_DATE - (FY_START_DATE - (TO_NUMBER(TO_CHAR(FY_START_DATE, 'D')) - 1)) ) / 7
    ) + 1 AS WEEK_OF_FY
FROM DATE_WITH_FY
ORDER BY DATE_ID ASC;

公式说明

  • FY_START_DATE - (TO_NUMBER(TO_CHAR(FY_START_DATE, 'D')) - 1):计算财年起始日的前一个周日,确保周起始为周日的规则生效
  • 用当前日期减去该周日的天数差除以7取整,再加1得到财年周数,该逻辑不受日历年切换影响,不会出现负数结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 16:55:16