Существует таблица:
CREATE TABLE wkt_summary (
id BIGINT,
org_id BIGINT, -- ID организации
wkt_id BIGINT, -- ID рабочего переода
wkt_start timestamp with time zone, -- Дата/Время начала работы
wkt_finish timestamp with time zone -- Дата/Время окончания работы
);
В ней есть данные:
INSERT INTO wkt_summary (org_id, wkt_id, wkt_start, wkt_finish) VALUES
(1,100,'2014-12-16 09:00:00+03', '2014-12-16 13:00:00+03'),
(1,101,'2014-12-16 14:00:00+03', '2014-12-16 18:00:00+03'),
(2,103,'2014-12-17 14:00:00+03', '2014-12-16 20:00:00+03'),
(2,104,'2014-12-18 09:00:00+03', '2014-12-16 14:00:00+03');
Требуется вывести из таблицы wkt_summary все записи которые: работают сейчас или будут работать в будущем
для определенности возьмем время 2014-12-16 12:00
То есть в результате работы должно получится:
id | org_id | wkt_id | wkt_start | wkt_finish
----+--------+--------+------------------------+------------------------
| 1 | 100 | 2014-12-16 09:00:00+03 | 2014-12-16 13:00:00+03
| 2 | 103 | 2014-12-17 14:00:00+03 | 2014-12-16 20:00:00+03
| 2 | 104 | 2014-12-18 09:00:00+03 | 2014-12-16 14:00:00+03
Сейчас у меня есть запрос:
with
c as (
select * from wkt_summary where '2014-12-16 12:00:00+03'::timestamptz between wkt_start and wkt_finish
),
f as (
select * from wkt_summary where wkt_start > '2014-12-16 12:00:00+03'::timestamptz
),
r as (
select * from c
UNION ALL
select * from f WHERE org_id not in (select org_id from c)
)
select * from r;
Возможно ли этот запрос как-нибудь упростить?