|
我有一个包含每个开始日期和结束日期的表:
: H( Q# v4 g4 r% J# Z% z- |DROP TABLE temp_period;
0 f/ Q9 R d9 S. I5 o0 T7 A2 JCREATE TABLE public.temp_period: H' O. ]% I- A
(% J3 H0 f) t) Q) ^+ X. I p
id integer NOT NULL,
6 [: s; q+ C% D8 P/ T "startDate" date,7 Q& d0 K7 s; T4 V' O4 V
"endDate" date' u' D" R# l2 U% @( y/ q
);
% l. k( }" J) P; \INSERT INTO temp_period(id,"startDate","endDate") VALUES(1,'2010-01-01','2010-03-31');1 c0 h/ ^! q* Z& ^! G6 U8 Y
INSERT INTO temp_period(id,"startDate","endDate") VALUES(2,'2013-05-17','2013-07-18');
7 q/ ~1 Q8 ?1 U8 n: |9 p% C2 eINSERT INTO temp_period(id,"startDate","endDate") VALUES(3,'2010-02-15','2010-05-31');
! L- n( k. Y! `( e# ]INSERT INTO temp_period(id,"startDate","endDate") VALUES(7,'2014-01-01','2014-12-31');
! Y, Q* W4 q* o: w3 \: xINSERT INTO temp_period(id,"startDate","endDate") VALUES(56,'2014-03-31','2014-06-30');% \ u2 T+ @+ w
现在,我想知道存储在那里的所有期间的总持续时间。我只需要时间作为一个时间interval。这很简单:- N! b, e% G3 e% V& G
SELECT sum(age("endDate","startDate")) FROM temp_period;
3 T; V& G& ?* z. K2 B: N但是,问题是:这些时间段确实重叠。我想消除所有重叠的时间段,以便获得表中至少一个记录所覆盖的总时间。+ r& T! F- ]1 Z/ m) }
您会发现,时间之间存在相当大的差距,因此,将最小的开始日期和最近的结束日期传递给age函数将无法解决问题。但是,我考虑过这样做并减去缺口的总量,但是我没有想到任何一种优雅的方法来做到这一点。
- C7 b0 D( c! k9 j- g8 m我使用PostgreSQL 9.6。0 g4 W! g$ c/ _2 w# B3 f
' x1 G) N U. Q6 K7 h2 b# G
解决方案: |
|