回答

收藏

排除时间汇总函数中的重叠时段

技术问答 技术问答 587 人阅读 | 0 人回复 | 2023-09-11

我有一个包含每个开始日期和结束日期的表:
! u9 ^. h7 A, d" TDROP TABLE temp_period;
: l. I' Y: @: V2 fCREATE TABLE public.temp_period
2 Z- q2 X2 i4 c9 t" B' a/ P  v8 L(
1 `! T* |4 w7 E: [7 R  id integer NOT NULL,. z. p5 ^7 P, u6 t6 c
  "startDate" date,
8 }+ L2 f  g8 j+ i& ^  "endDate" date
3 d4 V/ t; ~5 I# x);4 z6 o' f, _. V' ~0 Z- ^
INSERT INTO temp_period(id,"startDate","endDate") VALUES(1,'2010-01-01','2010-03-31');5 j  Y" L/ I# l7 w3 U7 S5 V
INSERT INTO temp_period(id,"startDate","endDate") VALUES(2,'2013-05-17','2013-07-18');0 [; ]: J0 s2 Q  T) Y
INSERT INTO temp_period(id,"startDate","endDate") VALUES(3,'2010-02-15','2010-05-31');
* a+ Y* q+ `" ]INSERT INTO temp_period(id,"startDate","endDate") VALUES(7,'2014-01-01','2014-12-31');4 Q2 r- g9 ?& x
INSERT INTO temp_period(id,"startDate","endDate") VALUES(56,'2014-03-31','2014-06-30');
( m  ]4 S* ^, M0 ~; t* |+ `4 O* t现在,我想知道存储在那里的所有期间的总持续时间。我只需要时间作为一个时间interval。这很简单:
) l& ]# Z) ^4 d. y- i7 I7 vSELECT sum(age("endDate","startDate")) FROM temp_period;
& i4 O; o5 {0 [/ R' l  ~- a; q但是,问题是:这些时间段确实重叠。我想消除所有重叠的时间段,以便获得表中至少一个记录所覆盖的总时间。& W1 Q1 r' H' d
您会发现,时间之间存在相当大的差距,因此,将最小的开始日期和最近的结束日期传递给age函数将无法解决问题。但是,我考虑过这样做并减去缺口的总量,但是我没有想到任何一种优雅的方法来做到这一点。
8 Y' b" Q5 [+ K! M. Y6 E2 u我使用PostgreSQL 9.6。0 ~7 X1 j" s! ~6 t6 p9 |% |
               
9 Z" ~0 C" v; k. T解决方案:
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则