我想获得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个日期执行相同的操作。我将不胜感激任何帮助。
答案 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