如何在DB2中查找当前财政年度的季度,半年和年份的最后一天?

时间:2016-10-02 06:21:54

标签: sql date db2

我想获得DB2当前财政年度的四分之一,半年和一年的最后一天。我们的财政年度从4月1日开始,到3月31日结束。因此,如果今天的日期是2016年10月2日,则季末结束日期为2016年12月31日,半年日期为2017年3月31日,年终日期为2017年3月31日。类似地,如果输入日期是2016年5月7日,那么季度结束日期将是2016年6月30日,半年日期将是2016年9月30日,年终日期将是2017年3月31日。< / p>

我可以使用DB2中的last_day函数获取一个月的最后一个日期,但是我无法对获取其他3个日期执行相同的操作。我将不胜感激任何帮助。

4 个答案:

答案 0 :(得分:0)

计算一个季度内的月份数(即1/2/3),然后为第一季度的第1个月和第2季度的1个月增加2个月(MOD(2-(MONTH(CURRENT_DATE)-1),3) = 0/1 / 2)。现在您的月份始终是2012年6月3日至6月,您可以申请last_day

我没有DB2系统来测试它,但语法似乎是这样的:

LAST_DAY(CURRENT_DATE + (MOD(2-(CURRENT_DATE-1),3) MONTH))

答案 1 :(得分:0)

你可以用日期做一些非常灵活的事情,但是DB2(我知道)没有具体的内容可以找到相关财务季度的日期,所以围绕当前的一些案例陈述可能需要一个月。

dataSource.DataSource = new User("New Name"); 

然后,您可以在当月使用一些案例陈述来查找半年和明年的类似信息。

我知道这看起来有点乱,但是它会完成这项工作。我建议使用此代码创建一个标量函数,您可以轻松地重复使用该函数来查找该季度,并在半年和全年内使用类似的函数。

资料来源:每天都在使用DB2作为商业智能分析师

答案 2 :(得分:0)

此处给出的查询和例程的验证是在DB2 for IBM i 7.3 [aka v7r3]

上完成的

没有关于如何使用数据的指示[以便知道数据需要或可以提供的形式],但是以下用户定义表函数(UDTF)定义了一些表示映射/相关性的常量传入的MONTH [可选DATE作为输入;如果没有提供参数,则默认为CURRENT DATE,到季度末和半末期以及季度;该映射允许一些相当简单的日期算术来提供所需的值,而无需创建实际的[持久]日历表:

create function OUR_FINANCIAL_YEAR_DATES                       
( input_date date default current date )                       
returns table                                                  
( "Last_Day_Of_Quarter"   /* for LD_QTR  */ date               
, "Last_Day_Of_Half_Year" /* for LD_HALF */ date               
, "Last_Day_Of_Year"      /* for LD_YEAR */ date               
) language sql                                                 
return                                                         
 with                                                          
   moMap ( mo, hAddMo, qAddMo, q ) as ( values                 
      ( 12, 3 , 0 , 3 ), ( 11, 4 , 1 , 3 ), ( 10, 5 , 2 , 3 )  
    , (  9, 0 , 0 , 2 ), (  8, 1 , 1 , 2 ), (  7, 2 , 2 , 2 )  
    , (  6, 3 , 0 , 1 ), (  5, 4 , 1 , 1 ), (  4, 5 , 2 , 1 )  
    , (  3, 0 , 0 , 4 ), (  2, 1 , 1 , 4 ), (  1, 2 , 2 , 4 ) )
 , endFYdates ( end_Qtr, end_Hyr, end_Fyr ) as                 
   ( select                                                    
       last_day( input_date   +  qAddMo MONTHS )     as Qtr_end
     , last_day( input_date   +  hAddMo MONTHS )     as Hyr_end
     , last_day( input_date   + (qAddMo + ( 3 * ( 4 - q ) )    
                                )       MONTHS )     as Fyr_end
     from moMap as M                                           
     where mo = month( input_date   )                          
   )                                                           
 select end_Qtr, end_Hyr, end_Fyr                              
 from endFYdates                                               

当然,标量用户定义函数(UDF)可以很容易地使用上面的UDTF来实现获取这些值中的任何一个;也许用第二个参数来识别要返回的DATE值中的哪一个。

with                                                                
  variousDates ( dv ) as ( values                                   
  ( date'2016-05-01' ), ( date'2016-05-02' ), ( date'2016-06-30' )  
, ( date'2016-07-02' ), ( date'2016-08-02' ), ( date'2016-09-30' )  
, ( date'2016-10-01' ), ( date'2016-11-02' ), ( date'2016-12-30' )  
, ( date'2017-01-02' ), ( date'2017-03-02' ), ( date'2017-03-30' ) )
select vdv.*, fyv.*                                                 
     , dec( quarter( vdv.dv - 3 months ) , 1 ) as qtr               
from variousDates as vdv                                            
, lateral                                                           
  ( select s.* from table(OUR_FINANCIAL_YEAR_DATES(vdv.dv)) as s    
  ) as fyv                                                          
order by 1                                                          
; -- a likeness of a report from the above query:
DV          LAST_00001  LAST_00002  LAST_00003  QTR
2016-05-01  2016-06-30  2016-09-30  2017-03-31   1 
2016-05-02  2016-06-30  2016-09-30  2017-03-31   1 
2016-06-30  2016-06-30  2016-09-30  2017-03-31   1 
2016-07-02  2016-09-30  2016-09-30  2017-03-31   2 
2016-08-02  2016-09-30  2016-09-30  2017-03-31   2 
2016-09-30  2016-09-30  2016-09-30  2017-03-31   2 
2016-10-01  2016-12-31  2017-03-31  2017-03-31   3 
2016-11-02  2016-12-31  2017-03-31  2017-03-31   3 
2016-12-30  2016-12-31  2017-03-31  2017-03-31   3 
2017-01-02  2017-03-31  2017-03-31  2017-03-31   4 
2017-03-02  2017-03-31  2017-03-31  2017-03-31   4 
2017-03-30  2017-03-31  2017-03-31  2017-03-31   4 
********  End of data  ********                    

以下UDTF 计算给定DATE值的季度结束值作为输入[对于CURRENT_DATE,如果没有参数传递],但另外计算并提供Start-Of-从计算日期开始的每个季度的Quarter和Of-Of_Quarter值,加上提供给定DATE值的半年末,年终和季度的计算结果:

create function THE_FINANCIAL_YEAR_DATES          
( input_date date default current date )          
returns table                                     
( LastOfQtr               /* for LD_QTR  */ date  
, LastOfHalf              /* for LD_HALF */ date  
, LastOfYear              /* for LD_YEAR */ date  
, NumberQtr               /* for NO_QTR  */ dec(1)
, FirstOfQ1               /* for FD_Q1   */ date  
, Last_OfQ1               /* for LD_Q1   */ date  
, FirstOfQ2               /* for FD_Q2   */ date  
, Last_OfQ2               /* for LD_Q2   */ date  
, FirstOfQ3               /* for FD_Q3   */ date  
, Last_OfQ3               /* for LD_Q3   */ date  
, FirstOfQ4               /* for FD_Q4   */ date  
, Last_OfQ4               /* for LD_Q4   */ date  
) language sql                                    
return                                                              
 with                                                               
   endCurQtr  ( ecq , q ) as                                        
     ( values                                                       
        ( LAST_DAY(   input_date                                    
                    + ( MOD( 1 - MONTH( input_date )                
                           , 3 ) + 2                                
                      ) MONTHS                                      
                  )                                                 
        , DEC( QUARTER( input_date - 3 MONTHS ), 1 )                
        )                                                           
     )                                                              
, curFYdates (q, ecq, sQ1, eQ1, sQ2, eQ2, sQ3, eQ3, sQ4, eQ4, eHY) as
  ( select q, ecq,                                                  
      ( ecq + 1 day )   - (   3 * ( q     )  ) months               
    , last_day( ( ecq ) - (   3 * ( q - 1 )  ) months )             
    , ( ecq + 1 day )   - (   3 * ( q - 1 )  ) months               
    , last_day( ( ecq ) - (   3 * ( q - 2 )  ) months )        
    , ( ecq + 1 day )   - (   3 * ( q - 2 )  ) months          
    , last_day( ( ecq ) - (   3 * ( q - 3 )  ) months )        
    , ( ecq + 1 day )   - (   3 * ( q - 3 )  ) months          
    , last_day( ( ecq ) - (   3 * ( q - 4 )  ) months )        
    , last_day( ( ecq ) - (   3 * ( q -                        
           case when q>2 then 4 else 2 end)  ) months )        
    from endCurQtr                                             
  )                                                            
select ecq, eHY, eQ4, q, sQ1, eQ1, sQ2, eQ2, sQ3, eQ3, sQ4, eQ4
from curFYdates                                                

答案 3 :(得分:0)

这是我用来计算上一季度最后一天的内容:

SELECT 
CASE WHEN MONTH(CURRENT DATE) BETWEEN 1 AND 3 
THEN DATE(YEAR(CURRENT DATE) -1 || '-12-31')  
WHEN MONTH(CURRENT DATE) BETWEEN 4 AND 6 
THEN DATE(YEAR(CURRENT DATE) || '-03-31') 
WHEN MONTH(CURRENT DATE) BETWEEN 7 AND 9 
THEN DATE(YEAR(CURRENT DATE) || '-06-30') 
WHEN MONTH(CURRENT DATE) BETWEEN 10 AND 12 
THEN DATE(YEAR(CURRENT DATE) || '-09-30')END AS QTR_END 
FROM SYSIBM.SYSDUMMY1