Sql 将日期截断为会计年度

Sql 将日期截断为会计年度,sql,oracle,oracle11g,truncate,Sql,Oracle,Oracle11g,Truncate,以下数据库视图将日期截断为会计年度(4月1日): 创建或替换查看会计年度作为 挑选 案例 什么时候到_number(到_char(SYSDATE,'MM'))

以下数据库视图将日期截断为会计年度(4月1日):

创建或替换查看会计年度作为
挑选
案例
什么时候到_number(到_char(SYSDATE,'MM'))<4然后
截止日期('1-APR-'| |至|字符(添加_个月(SYSDATE,-12),'YYYY'),'dd-MON-YYYY'))
其他的
截止日期('1-APR-'| |至字符(系统日期,'YYYY'),'dd-MON-YYYY')
作为财政年度结束
从…起
二重的
这允许我们根据今天的日期计算当前会计年度

如何简化或优化此计算?

也许这

SELECT to_date('01/04/' ||
to_char(extract(YEAR FROM SYSDATE)
- CASE WHEN extract(MONTH FROM SYSDATE) BETWEEN 1 AND 4 THEN 1 ELSE 0 END),
'DD/MM/YYYY') FROM dual;
我想这是另一个选择

SELECT add_months(trunc(SYSDATE) - extract(DAY FROM SYSDATE) + 1,
- (extract(MONTH FROM SYSDATE) + CASE
WHEN extract(MONTH FROM SYSDATE) <= 4 THEN 12 ELSE 0 END) + 4)
FROM dual;
选择添加月份(trunc(SYSDATE)-extract(从SYSDATE开始的日期)+1,
-(摘录(从SYSDATE算起的月份)+案例
当提取(SYSDATE的月份)时,TRUNC()可以有效地应用于具有不同格式掩码的日期。最恰当的是,
TRUNC(SYSDATE,'yyyy')
为我们提供了一年的第一天。因此这将为我们提供当年的01-APR

add_months(trunc(sysdate, 'yyyy'), 3)
上一年的这个日期

add_months(trunc(add_months(sysdate, -12), 'yyyy'), 3)
因此:

警告:我还没有机会测试这段代码,因此它可能包含打字错误。我将稍后进行测试,并在必要时进行更正。

我发现oracle的to_CHAR(date,'Q')功能对于计算会计日历非常有用。下面的查询使用'with'子句来构建两件事

  • 样本数据-测试日期表
  • 财政地图-日历季度到您的财政日历的简单映射。在本例中,第四个日历季度是第一个财政季度(10月1日)
  • 例如:

    with test_dates as (
     select sysdate + level * 80 test_date from dual connect by level < 11
    ),
    fiscal_map as (
     select 1 cal, 2 fiscal from dual
     union
     select 2 cal, 3 fiscal from dual
     union
     select 3 cal, 4 fiscal from dual
     union
     select 4 cal, 1 fiscal from dual
    )
    select 
     test_date, 
     TO_CHAR(test_date, 'Q') cal_quarter, 
     fiscal_map.fiscal,
     (case when CAL < fiscal then 
         TO_CHAR(test_date, 'yyyy') + 0
         else TO_CHAR(test_date, 'yyyy') + 1
     end) FISCAL_YEAR
    from test_dates, fiscal_map
    where fiscal_map.cal = TO_CHAR(test_date, 'Q')
    order by test_date
    

    查询结果不同。您提供的代码返回今天的2009-04-01。它应该返回2010-04-01。
    add_months(trunc(add_months(sysdate, -12), 'yyyy'), 3)
    
    CREATE OR REPLACE VIEW FISCAL_YEAR_VW AS
    WITH cte as 
        ( select add_months(trunc(sysdate, 'yyyy'), 3) as this_year
                 , add_months(trunc(add_months(sysdate, -12), 'yyyy'), 3) as last_year
          from dual )
    SELECT
      CASE
        WHEN SYSDATE >= cte.this_year THEN    
          cte.this_year
        ELSE
          cte.last_year
      END AS fiscal_year
    FROM
      cte;
    
    with test_dates as (
     select sysdate + level * 80 test_date from dual connect by level < 11
    ),
    fiscal_map as (
     select 1 cal, 2 fiscal from dual
     union
     select 2 cal, 3 fiscal from dual
     union
     select 3 cal, 4 fiscal from dual
     union
     select 4 cal, 1 fiscal from dual
    )
    select 
     test_date, 
     TO_CHAR(test_date, 'Q') cal_quarter, 
     fiscal_map.fiscal,
     (case when CAL < fiscal then 
         TO_CHAR(test_date, 'yyyy') + 0
         else TO_CHAR(test_date, 'yyyy') + 1
     end) FISCAL_YEAR
    from test_dates, fiscal_map
    where fiscal_map.cal = TO_CHAR(test_date, 'Q')
    order by test_date
    
    TEST_DT CAL_Q   FISCAL Q    FISCAL_YR
    22-Jul-10   3   4   2010
    10-Oct-10   4   1   2011
    29-Dec-10   4   1   2011
    19-Mar-11   1   2   2011
    07-Jun-11   2   3   2011
    26-Aug-11   3   4   2011
    14-Nov-11   4   1   2012
    02-Feb-12   1   2   2012
    22-Apr-12   2   3   2012
    11-Jul-12   3   4   2012
    
    select T.USERNAME,T.CREATED,
    
    CASE WHEN EXTRACT (MONTH FROM T.CREATED)>=4 AND EXTRACT (MONTH FROM T.CREATED)<=12 THEN 
    TO_CHAR(EXTRACT (YEAR FROM T.CREATED))||'-'||TO_CHAR(EXTRACT (YEAR FROM T.CREATED)+1)
      WHEN EXTRACT (MONTH FROM T.CREATED)<4 THEN 
    TO_CHAR(EXTRACT (YEAR FROM T.CREATED)-1)||'-'||TO_CHAR(EXTRACT (YEAR FROM T.CREATED)) ELSE NULL END FY
    from sys.dba_users t WHERE T.USERNAME in ('101655','100149')
    
    1   101655  14/01/2014 12:21:53 2013-2014
    2   100149  05/05/2012 16:55:00 2012-2013