如何使用 OCONV 减去日期

How to subtract dates using OCONV

背景: 我负责使用 datastage 创建数据库提取。我们有超过五年的 CreatedDt(日期数据类型)数据。在导出查询中,我需要为 CreatedDt 添加一个 BETWEEN 子句。因为数据阶段作业是通用化和参数化的,所以我需要在序列中计算日期。

例如: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”代表 adding/subtracting 一天。使用前面提到的计算问题。

我试过了:

OConv(Iconv(Date(),"D/YM[4,2]") + 1), "D/YMD[4,2,2]")

以为我每个月+1,但这离我的目标点还有好几年。

我需要知道如何在给定日期执行我需要的操作。或者,如果有其他方法,我不仅仅是开放。

谢谢

Because the datastage job is generalized and parameterized

并不意味着您不能在数据库中计算开始日期和结束日期,并从那里 select 计算。 数据库通常提供很多函数来进行日期计算,使事情变得容易得多。您可以 运行 SELECT selectng 开始和结束日期并将其写入文件。在序列中,您可以读取该文件并将其作为参数提供给您的作业。

如果你坚持你的数据阶段基本计算,我想这将是很多步骤。 您可以使用 IF THEN ELSE 逻辑在转换器中手动进行月份计算。挑战之一是获取结束日期(开始日期始终为 1。),但 DaysInMonth 函数可以帮助您。 DateFromComponents 然后可以帮助您重新组合日期。

开始日期 Oconv(日期() - 2, "D-YM[4,2]") : "-01"

结束日期 Oconv(Iconv((Oconv(Date(), "DY") : "-" : Oconv(Date(), "DM") + 4 : "-01") - 1, "DYMD" ), "D-YMD[4,2,2]")

此结束日期计算适用于 1 月至 8 月。调整年份和月份的数学运算并包装在 If..Then..Else 结构中以处理其他月份。

使用 DivMod 函数。

13 个月前的示例:

OConv(Date(),'D-Y[4]')-Div(13,12):'-':OConv(Date(),'D-M[2]')-Mod(13,12):'-':oconv(Date(),'D-D[2]')