Помогите с оптимизацией запроса

chernomyrdin
Дата: 16.12.2014 17:49:33
Существует таблица:
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;


Возможно ли этот запрос как-нибудь упростить?
grgdvo
Дата: 17.12.2014 14:02:49
chernomyrdin,

1. По-моему у Вас ошибка в примере. Как может работа закончиться раньше своего начала???
2. Если Вы говорите о времени, то может здесь все просто - надо проверить для всех записей больше заданной даты, что время попадает в заданный интервал?? Иначе, я вообще не понимаю вашу задачу.

select
 *
from 
 wkt_summary
where
  wkt_start >= '2014-12-16 12:00:00+03'::timestamptz and
  12 between extract(hour from wkt_start) and extract(hour from wkt_finish)


Набрасал на память. Может где и ошибся в синтаксисе.
Anatoly B
Дата: 19.12.2014 13:20:53
По идее, если работают сейчас или будет работать в будущем, то дата финиша д.б. больше, чем сейчас ( 2014-12-16 12:00), при условии, конечно, что wkt_start <= wkt_finish