在搜索答案时,我发现了这个问题,但我无法找到在SQL中表达解决方案的方法: Union of intervals
我试图计算我在公司工作的人员的工作时间。在我拥有的数据库中(已经在公司已有多年并且[可悲]不可更改),每个合同都存储为一行。每条线都有很多关于员工和合同的信息,包括合同创建日期,合同解除日期(或无限期,如果仍然有效)和当前合同情况("活跃"或&#34 ;去激活&#34)。然而,有两个问题使我无法简单地做一些看似显而易见的事情:
当试图考虑这种情况可能产生的多种情况时(例如,如果同一个人在那段时间内有很多合同,那么在60天以上没有合同,然后是其他一些合同,那么我&#39 ; d想要从"超过60天"期间开始计算,我发现有两个规则可以解决问题。我需要:
为解决这个问题,我决定重新安排规则。我想在创建之前的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个中远离(高于)其他的,并且不在其他行所描述的区间内?
[而且,无论如何,这似乎是解决问题的最佳方法吗? (我不这么认为)]