获得间隔联合的开始

时间:2014-04-16 23:17:50

标签: sql oracle11g intervals

声明

在搜索答案时,我发现了这个问题,但我无法找到在SQL中表达解决方案的方法: Union of intervals

背景

我试图计算我在公司工作的人员的工作时间。在我拥有的数据库中(已经在公司已有多年并且[可悲]不可更改),每个合同都存储为一行。每条线都有很多关于员工和合同的信息,包括合同创建日期,合同解除日期(或无限期,如果仍然有效)和当前合同情况("活跃"或&#34 ;去激活&#34)。然而,有两个问题使我无法简单地做一些看似显而易见的事情:

  1. 人们可以"多语言",所以同一个人可以同时拥有多条活动线。
  2. 有时会有一些转移导致某个人的合同停用并创建新的合同行。不得计算这些转移(即,我应考虑两个时间表)。但是,数据库中存在转移存在的明确标志,因此定义了如果在创建新合同之前60天有任何合同撤销,则转移是#34;。
  3. 当试图考虑这种情况可能产生的多种情况时(例如,如果同一个人在那段时间内有很多合同,那么在60天以上没有合同,然后是其他一些合同,那么我&#39 ; d想要从"超过60天"期间开始计算,我发现有两个规则可以解决问题。我需要:

    1. 最后一次合同创建,当时没有其他合同已经生效。 (这解决了问题1)
    2. &安培;&安培;在60天之前没有其他有效合同。
    3. 到DB

      为解决这个问题,我决定重新安排规则。我想在创建之前的60天之前拿出所有没有其他有效合同的合同,然后采取" MAX()"他们所以,例如,对于下一个人,我会说自1973年以来她一直很活跃:

      +----------+-----+-----------+-----------+---------------+-----------------+
      | CONTRACT | ... | PERSON_ID |   STATUS  | CREATION_DATE | RESCISSION_DATE |
      +----------+-----+-----------+-----------+---------------+-----------------+
      |        1 | ... |         1 | deactived |    1973/10/01 |      1999/07/01 |
      |        2 | ... |         1 | deactived |    1978/06/01 |      2000/07/01 |
      |        3 | ... |         1 | deactived |    2000/08/01 |      2008/06/01 |
      |        4 | ... |         1 |    active |    2000/08/01 |        infinity |
      |        5 | ... |         1 |    active |    2000/08/01 |        infinity |
      +----------+-----+-----------+-----------+---------------+-----------------+
      

      我将日期视为整数(实际上,它们位于真实数据库中)。我的问题是:如何创建一个查询以采取" 1973/10/0"?也就是说,我怎么能得到所有" creation_date" s,它们在至少60个中远离(高于)其他的,并且不在其他行所描述的区间内?

      [而且,无论如何,这似乎是解决问题的最佳方法吗? (我不这么认为)]

0 个答案:

没有答案