如何使用 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
(基本上跳过一个月前去三个月)
我知道这意味着正在使用以下计算:
- 从 "Today" 中减去(两次)
- 转到月初(开始日期)
- 转到该月的最后一天(对于结束日期)
我正在使用这个公式:
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 结构中以处理其他月份。
使用 Div
和 Mod
函数。
13 个月前的示例:
OConv(Date(),'D-Y[4]')-Div(13,12):'-':OConv(Date(),'D-M[2]')-Mod(13,12):'-':oconv(Date(),'D-D[2]')
背景: 我负责使用 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
(基本上跳过一个月前去三个月)
我知道这意味着正在使用以下计算:
- 从 "Today" 中减去(两次)
- 转到月初(开始日期)
- 转到该月的最后一天(对于结束日期)
我正在使用这个公式:
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 结构中以处理其他月份。
使用 Div
和 Mod
函数。
13 个月前的示例:
OConv(Date(),'D-Y[4]')-Div(13,12):'-':OConv(Date(),'D-M[2]')-Mod(13,12):'-':oconv(Date(),'D-D[2]')