Интервалы дат

Имеется таблица с интервалами дат. Необходимо написать запрос, который позволит объединить периоды, которые пересекаются или граничат.
Пример данных:

CREATE TABLE "T_DT" 
("BEG_DATE" DATE,
 "END_DATE" DATE
) NOLOGGING TABLESPACE MIRAVILD_DATA;
/

INSERT INTO t_dt
  (beg_date, end_date)
VALUES
  (to_date('01.12.2013', 'dd.mm.yyyy'),
   to_date('31.12.2013', 'dd.mm.yyyy'));
INSERT INTO t_dt
  (beg_date, end_date)
VALUES
  (to_date('01.02.2014', 'dd.mm.yyyy'),
   to_date('10.02.2014', 'dd.mm.yyyy'));
INSERT INTO t_dt
  (beg_date, end_date)
VALUES
  (to_date('05.02.2014', 'dd.mm.yyyy'),
   to_date('28.02.2014', 'dd.mm.yyyy'));
INSERT INTO t_dt
  (beg_date, end_date)
VALUES
  (to_date('01.04.2014', 'dd.mm.yyyy'),
   to_date('30.04.2014', 'dd.mm.yyyy'));
INSERT INTO t_dt
  (beg_date, end_date)
VALUES
  (to_date('05.04.2014', 'dd.mm.yyyy'),
   to_date('10.04.2014', 'dd.mm.yyyy'));
INSERT INTO t_dt
  (beg_date, end_date)
VALUES
  (to_date('15.04.2014', 'dd.mm.yyyy'),
   to_date('20.04.2014', 'dd.mm.yyyy'));
INSERT INTO t_dt
  (beg_date, end_date)
VALUES
  (to_date('01.06.2014', 'dd.mm.yyyy'),
   to_date('15.06.2014', 'dd.mm.yyyy'));
INSERT INTO t_dt
  (beg_date, end_date)
VALUES
  (to_date('16.06.2014', 'dd.mm.yyyy'),
   to_date('30.06.2014 ', 'dd.mm.yyyy'));

COMMIT WORK;
/

Вариант запроса:

SELECT UNIQUE first_value(trunc(t_dt.beg_date, 'MM')) over(PARTITION BY t_dt.beg_date) AS beg_date,
       last_value(last_day(t_dt.end_date)) over(PARTITION BY t_dt.end_date) AS end_date
  FROM t_dt
 ORDER BY beg_date;
/

Результат:

   	BEG_DATE	END_DATE
	01.12.2013	31.12.2013
	01.02.2014	28.02.2014
	01.04.2014	30.04.2014
	01.06.2014	30.06.2014

P.S.
Конфигурация СУБД — Oracle Database 11g Express Edition Release 11.2.0.2.0
IDE — PL/SQL Developer Version 11.0.6.1776

Tags: ,

Comments are closed.