将日期范围分为具有开始日期和结束日期的范围内的每一天

时间:2017-09-20 21:53:38

标签: java sql etl transformation informatica

我的情况是,具有日期范围的行必须在该日期范围内的所有日期分成多行。有没有人知道如何在Informatica powercenter中获取目标(如附件)?

消息来源

code        start date            end date
ADMISSION   01/01/2017 02:05:11   01/01/2017 04:20:53
TRANSFER    01/01/2017 04:20:54   01/03/2017 18:30:48
DISCHARGE   01/03/2017 18:30:49   01/03/2017 20:18:11

TARGET

code        start date            end date
ADMISSION   01/01/2017 02:05:11   01/01/2017 04:20:53
TRANSFER    01/01/2017 04:20:54   01/01/2017 11:59:59
TRANSFER    01/02/2017 00:00:00   01/02/2017 11:59:59
TRANSFER    01/03/2017 00:00:00   01/03/2017 18:30:48
DISCHARGE   01/03/2017 18:30:49   01/03/2017 20:18:11

提前谢谢!

3 个答案:

答案 0 :(得分:0)

请尝试使用java转换! 找出开始和结束日期之间的差异, 在java转换中使用rowgen创建新记录。 希望这能回答你的问题。

答案 1 :(得分:0)

最简单的方法是,由于日期记录的日期大于或等于开始日期的日期并且小于或等于结束日期,您可以在每个记录(源限定符中的sql连接)中加入日期表。天。然后在映射中添加额外的逻辑以从starttime字段中选择开始时间wben日期是相同的,否则从datetablestarttime开始,并且类似于结束时间

答案 2 :(得分:0)

PowerCenter中没有对行乘法的原生支持。因此需要一种解决方法。计算日期差异并使用它来乘以行。选项包括:

  • 使用Java Transformation生成额外的行(here's an example
  • 使用[1,2,2,3,3,3,...]等数据创建一个虚拟表,并使用它来加入日期差异。请记住,行数增长很快,不建议大数字
  • 创建活动的非缓存查找,该查找将返回给定输入的适当行数。使用SQL查询覆盖为每个已处理的行*
  • 获取所需的行数

*假设您使用myNumber列类型bigint创建myNumbers表并使用从1到X的序列填充一次,您可以使用以下查询进行查找覆盖:SELECT 1 FROM myNumbers WHERE myNumber = ?in_lookup_port_name?。使用值为1的虚拟端口作为条件。