如何使用OCONV减去日期

时间:2019-02-22 21:56:15

标签: datastage

背景: 我负责使用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,但这距离我的目标要数年了。

我需要知道如何在给定日期进行所需的操作。或者,如果还有另一种方法,我不只是开放。

谢谢

3 个答案:

答案 0 :(得分:1)

使用DivMod函数。

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构造以处理其他月份。