【问题标题】:How to get all missing days between two dates如何获取两个日期之间的所有缺失天数
【发布时间】:2017-09-17 09:15:30
【问题描述】:

我会先尝试在抽象的层面上解释这个问题:

我有 X 数量的数据作为输入,它总是会有一个字段 DATE。之前,作为输入(在某些过程之后)的日期放在表格中作为输出。现在,我被要求输入输入日期和收到的最小日期和从那一刻起一年之间的任何日期。如果这两个日期之间的某一天最初没有输入,则所有字段都必须带有 0 或等效值。

示例。我有两个输入。一个带有“18/03/2017”,另一个带有“18/03/2018”。我现在需要为“18/03/2017”和“18/04/2017”之间的所有缺失日期创建输出数据。因此,输出 '19/03/2017',每个字段都为 0,第 20 和 21 日也是如此,依此类推。

我知道以编程方式执行此操作,但在 powercenter 上我不知道。我被告知要执行以下操作(我已经完成了,但我想知道更好的方法):

获取最小日期,day0。然后,使用聚合器创建 365 个字段,每个字段都有“day0”+1、day0+2 等,以创建人工年份。

之后,我们进行了一些转换,例如对日期进行排序、它们之间的联合,以便为加入者准备好数据。连接器的想法是在原始数据和所有字段都为 0 的数据以及我们从前一个聚合器获得的数据之间进行完全外连接。

然后一个路由器用它的一个组选择具有实际日期的数据(和不带空值的字段)和其他所有字段都为空的组,然后给所述字段一个 0 以最终写入表。

我想知道如何实现这一点,对于初学者来说,无需将日期添加 365 天。如果我要在 10 年内而不是一年中执行相同的过程,那么这项任务很快就会变得可笑。

我想知道 XOR 类型的操作,或者其他一些可以减少我(可能是错误地)认为是一项简单任务需要完成的步骤的功能。目前,我现在需要 5 个步骤才能知道两个日期之间缺少哪些日期,从那时起最少和一年。

我试图尽可能地清楚,但如果我在任何时候失败了,请告诉我!

【问题讨论】:

    标签: date informatica informatica-powercenter


    【解决方案1】:

    您已经确定您知道如何以编程方式执行此操作,并且公平地说,这个问题更适合这种解决方案......但这并不排除 powercenter,只需将 2 个日期输入 java转换,应用一些代码来生成它们之间的所有日期,并为每个日期输出一条记录。 Java 转换非常适合记录生成

    好的...所以您可以覆盖您的源限定符以在选择查询本身中实现这一点(我将基于 Oracle 的示例作为我习惯的示例,并且我假设您的数据来自表)。我在这里查找了连接语法

    SQL to generate a list of numbers from 1 to 100

    SELECT (MIN(tablea.DATEFIELD) + levquery.n - 1) AS Port1 FROM tablea, (SELECT LEVEL n FROM DUAL CONNECT BY LEVEL

    (检查查询是否适合您 - 目前无法访问电脑进行测试)

    【讨论】:

      【解决方案2】:

      您已经确定您知道如何以编程方式执行此操作,并且公平地说,这个问题更适合这种解决方案......但这并不排除 powercenter,只需将 2 个日期输入 java转换,应用一些代码来生成它们之间的所有日期,并为每个日期输出一条记录。 Java 转换非常适合记录生成

      【讨论】:

      • 对。据我所知,公司内部是禁止做java转换的。根据政策,它不被接受。可惜得知这确实是最好的选择:((
      【解决方案3】:

      我不确定聚合器应该做什么? 与“完全外部”连接相同吗?常量端口上的正常连接很好:) c

      你能计算出'joiner'之前需要的'duplicates'数量吗?在这种情况下,配置为返回“所有行”和小于或等于谓词的查找可以帮助使映射更具可读性。

      在任何情况下,您都需要一个辅助表(或文件),其中包含一系列介于 1 和潜在重复项(或更多)之间的数字 我在仓库中使用我们的时间维度,从 1753-01-01 和 200000 每天有一行,然后有一个主整数列,其值从 1 及以上...

      【讨论】:

      • 好的,最后一个想法对我来说似乎很聪明,所以谢谢你,可能会在某个时候使用它。至于我可以计算加入者之前的重复数。这是我想念的部分内容。我将获得一些输入。但在加入之前,我不知道我错过了什么。如果可以的话,用powercenter,我不知道怎么做。在编程语言中,我会创建一个数据结构,甚至是一个简单的数组,将输入放在数组的位置,而我所缺少的就是空的。在这里,完全不确定:S
      • 我认为您需要阅读源代码两次:第一次,只是为了确定每个间隙的大小,第二次将第一次“传递”的结果连接到传入数据和生成副本。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-09
      • 1970-01-01
      相关资源
      最近更新 更多