背景: 我负责使用datastage创建数据库摘录。我们拥有CreatedDt(日期数据类型)的数据超过五年。在导出查询中,我需要为CreatedDt添加一个BETWEEN子句。由于datastage作业是通用化和参数化的,因此我需要在Sequence中计算日期。
例如:Select * from tableA where CreatedDt BETWEEN <<start Date>> and <<End Date>>
对于其中一个查询,我需要返回四个月并获得3个月的数据(跳过现在的上个月)。例如:
假设今天是02/22/2019
我需要:
Start Date: 10/01/2018
End Date: 12/31/2018
(基本上跳过一个月再走三个月)
我知道这意味着正在使用以下计算:
我正在使用以下公式:
OConv(Iconv(Date(),"D/YMD[4,2,2]") + 1), "D/YMD[4,2,2]")
据我了解,“ + 1”表示按天加/减。使用前面提到的计算问题。
我尝试过:
OConv(Iconv(Date(),"D/YM[4,2]") + 1), "D/YMD[4,2,2]")
认为我每个月+1,但这距离我的目标要数年了。
我需要知道如何在给定日期进行所需的操作。或者,如果还有另一种方法,我不只是开放。
谢谢
答案 0 :(得分:1)
使用Div
和Mod
函数。
13个月前的示例:
OConv(Date(),'D-Y[4]')-Div(13,12):'-':OConv(Date(),'D-M[2]')-Mod(13,12):'-':oconv(Date(),'D-D[2]')
答案 1 :(得分:0)
因为datastage作业是通用化和参数化的
并不意味着您无法在数据库中计算开始日期和结束日期,然后从中选择它。 数据库通常提供许多功能来执行此日期计算,从而使事情变得容易得多。您可以运行SELECT选择开始和结束日期并将其写入文件。按照顺序,您可以读取该文件并将其作为参数输入到您的作业中。
如果您坚持进行数据阶段的基本计算,我想这将涉及很多步骤。 您可以使用IF THEN ELSE逻辑在变压器中手动进行月份计算。难题之一是获取结束日期(开始日期始终为1),但是DaysInMonth函数可以为您提供帮助。然后,DateFromComponents可以帮助您重新组合日期。
答案 2 :(得分:0)
开始日期 Oconv(Date()-2,“ D-YM [4,2]”):“ -01”
EndDate Oconv(Iconv((Oconv(Date(),“ DY”):“-”:Oconv(Date(),“ DM”)+ 4:“ -01”)-1,“ DYMD”),“ D-YMD [4,2,2]“)
此结束日期计算适用于1月-8月。调整年份和月份的数学运算,并包装一个If..Then..Else构造以处理其他月份。