Oracle SQL财年周数计算咨询:财年始于6月1日,周日为周起始
计算自定义财年周数(财年始于6月1日,周日为周起始)
原公式TO_NUMBER(TO_CHAR(TO_DATE(DATE_ID + 1,'DD-Mon-YY'),'IW')) -21的问题在于:它依赖日历年的IW周数(周一为周起始),当日期跨到下一个日历年时,IW周数会重置为1,导致计算结果出现负数。以下是针对你的规则的解决方案:
解决方案思路
- 先将数字类型的
DATE_ID转换为标准日期格式,避免格式歧义 - 确定当前日期所属的财年起始日(6月1日):
- 若当前日期月份≥6,财年起始日为当年6月1日
- 若当前日期月份<6,财年起始日为上一年6月1日
- 基于周日为周起始的规则,计算日期在财年中的周数:通过计算当前日期与财年起始日前一个周日的天数差,再转换为周数
完整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
相关产品推荐
相关产品推荐

