|
我有一个包含每个开始日期和结束日期的表:8 A4 j; H( I- D* E
DROP TABLE temp_period;! q: i9 f8 r% y; ^( ]8 N* m
CREATE TABLE public.temp_period
% i5 G$ z/ `% O(
4 u( H3 ^/ p* V% e" b6 S3 o1 x( i id integer NOT NULL,
4 u8 P* Z& j8 |) l% G "startDate" date,
5 w) L s& S/ ~ "endDate" date
2 T9 a- r8 o8 G O- l8 n);
7 F$ e8 Y6 N) m! EINSERT INTO temp_period(id,"startDate","endDate") VALUES(1,'2010-01-01','2010-03-31');
' S: f. N, N' u: r3 n( H: R- ~1 sINSERT INTO temp_period(id,"startDate","endDate") VALUES(2,'2013-05-17','2013-07-18');
; u/ P+ ?1 {9 a" ]8 g$ d# X: _INSERT INTO temp_period(id,"startDate","endDate") VALUES(3,'2010-02-15','2010-05-31');
& b% j/ B, G' I" I% U4 W4 qINSERT INTO temp_period(id,"startDate","endDate") VALUES(7,'2014-01-01','2014-12-31');
2 U! t0 o, {3 ~: r: z" Q) IINSERT INTO temp_period(id,"startDate","endDate") VALUES(56,'2014-03-31','2014-06-30');
0 k; T/ i4 \6 h, M现在,我想知道存储在那里的所有期间的总持续时间。我只需要时间作为一个时间interval。这很简单:
& x9 E/ s5 B7 `1 S5 JSELECT sum(age("endDate","startDate")) FROM temp_period;; t, }, y; ~ s
但是,问题是:这些时间段确实重叠。我想消除所有重叠的时间段,以便获得表中至少一个记录所覆盖的总时间。8 D4 U2 e' a) w- t
您会发现,时间之间存在相当大的差距,因此,将最小的开始日期和最近的结束日期传递给age函数将无法解决问题。但是,我考虑过这样做并减去缺口的总量,但是我没有想到任何一种优雅的方法来做到这一点。+ F0 x& g0 s0 w2 q
我使用PostgreSQL 9.6。
( U1 V9 ~6 w9 E0 I7 v' k& v
) o1 m7 J$ h9 O D* d解决方案: |
|