暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 如何在查询中引用会计年度日历?

ASKTOM 2020-06-20
377

问题描述

我正在尝试在Oracle PL/SQL中创建一个日历,我需要两个日历: 会计年度日历和普通日历。我已经使用代码创建了它们:

会计年度日历:

WITH dts AS (SELECT TRUNC(to_date('&year', 'yyyy'), 'yyyy') + LEVEL + 181 AS dt
             FROM   dual
             CONNECT BY LEVEL <= to_char(TO_DATE(&YEAR || '1231', 'yyyymmdd'), 'ddd')),
           --  dt_mon AS (SELECT '7' from dual),
    dts2 AS (SELECT dt,
                    TRUNC(dt, 'mm') dt_mon,
                    TRUNC(dt, 'iw') dt_start_of_week,
                    to_char(dt, 'fmdd') day_of_month
             FROM   dts)

SELECT to_char(dt_mon, 'fmMonth') "MONTH",
       row_number() OVER (PARTITION BY to_char(dt_mon, 'fmMonth') ORDER BY dt_start_of_week) week_num,
       MAX(CASE WHEN dt = dt_start_of_week THEN day_of_month END) mon,
       MAX(CASE WHEN dt = dt_start_of_week + 1 THEN day_of_month END) tue,
       MAX(CASE WHEN dt = dt_start_of_week + 2 THEN day_of_month END) wed,
       MAX(CASE WHEN dt = dt_start_of_week + 3 THEN day_of_month END) thu,
       MAX(CASE WHEN dt = dt_start_of_week + 4 THEN day_of_month END) fri,
       MAX(CASE WHEN dt = dt_start_of_week + 5 THEN day_of_month END) sat,
       MAX(CASE WHEN dt = dt_start_of_week + 6 THEN day_of_month END) sun 
FROM   dts2
GROUP BY dt_mon,
         to_char(dt_mon, 'fmMonth'),
         dt_start_of_week
ORDER BY dt_mon, dt_start_of_week;


在我的查询中,如果我想指定会计年度日历,我该怎么做?如何使用此日历创建表以在查询中引用,如果我想存储时间序列数据,Oracle中是否有任何规定?这里的任何帮助将不胜感激。谢谢!!

专家解答

并不是因为 “财政” 年度的定义完全是使用它的组织的心血来潮。

我曾在4月的财政年度开始的地方和7月的其他地方工作过。同样,我在财政周从星期一开始的地方工作,其他地方则在星期五工作。我甚至在某些财政周的天数每年都在变化的地方工作,因为一年的第一天是在不同的一天开始的,所以他们把 “第8天” 塞进了一周的商业报告。

没有单一的 “财政” 年度。最终,大多数地方做你上面做的事情,即有一个表,它存储真实的日历,它映射到该公司的财政日历,并使用它 (通常) 作为维度表报告。

例如,这是我与之合作的客户的 (匿名) 片段。

CREATE TABLE DATE_REPORTING
(
 ,CAL_DATE                   DATE         NOT NULL
 ,CAL_MONTH_START            DATE         NOT NULL
 ,CAL_MONTH_END              DATE         NOT NULL
 ,CAL_MONTH_OF_YEAR          NUMBER(2)    NOT NULL
 ,CAL_MONTH_OF_FIN_YEAR      NUMBER(2)    NOT NULL
 ,CAL_MONTH_NAME_ABBR        VARCHAR2(3)  NOT NULL
 ,CAL_MONTH_NAME             VARCHAR2(20) NOT NULL
 ,CAL_QTR_START              DATE         NOT NULL
 ,CAL_QTR_END                DATE         NOT NULL
 ,CAL_YEAR                   NUMBER(4)    NOT NULL
 ,CAL_DAY_OF_MONTH           NUMBER(3)    NOT NULL
--
 ,DAY_OF_WEEK_ABBR           VARCHAR2(3)  NOT NULL
 ,DAY_OF_WEEK                VARCHAR2(10) NOT NULL
 ,FIN_DAY_OF_WEEK            NUMBER(2)    NOT NULL
--  
 ,FIN_WEEK_OF_MONTH          NUMBER(2)    NOT NULL
 ,FIN_WEEK_OF_YEAR           NUMBER(2)    NOT NULL
 ,FIN_WEEK_START             DATE         NOT NULL
 ,FIN_WEEK_END               DATE         NOT NULL
 ,FIN_SETTLEMENT_PERIOD_SEQ  NUMBER(10)   
--
 ,FIN_MONTH_NAME             VARCHAR2(10) NOT NULL
 ,FIN_MONTH_NAME_ABBR        VARCHAR2(3)  NOT NULL
 ,FIN_MONTH_OF_YEAR          NUMBER(2)    NOT NULL
 ,FIN_MONTH_START            DATE         NOT NULL
 ,FIN_MONTH_END              DATE         NOT NULL
 ,FIN_MONTH_WEEKS            NUMBER       NOT NULL
--
 ,FIN_QTR_START              DATE         NOT NULL
 ,FIN_QTR_END                DATE         NOT NULL
--  
 ,FIN_YEAR                   NUMBER(4)    NOT NULL
 ,FIN_YEAR_NAME              VARCHAR2(8)  NOT NULL
 ,FIN_YEAR_START             DATE         NOT NULL
 ,FIN_YEAR_END               DATE         NOT NULL
...
...
...


文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论