powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / пересечение трёх временных интервалов...?
7 сообщений из 7, страница 1 из 1
пересечение трёх временных интервалов...?
    #37839393
kkv79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
привет всем.
не пойму как решить такую задачку....

первый временной интервал - это рабочее время. С '08:00:00'::time до '17:00:00'::time каждый день. (без выходных и обедов)
второй интервал - это просто один длинный интервал. например от '2012-06-12 02:56:21.479967+04' до '2012-06-14 15:36:50.469214+04'
третий - это таблица
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
drop table test;
CREATE TABLE test
(
  data_on timestamp with time zone,
  data_off timestamp with time zone 
)
WITH (
  OIDS=FALSE
);

insert into test (data_on, data_off) values ('2012-06-10 07:30:10.346695+04','2012-06-10 10:30:24.104155+04'); -- этот не входит (слишком давно. 10-е число)
insert into test (data_on, data_off) values ('2012-06-12 05:30:10.346695+04','2012-06-12 15:30:24.104155+04'); -- этот частично с 8 утра до 15.30
insert into test (data_on, data_off) values ('2012-06-12 16:30:33.611383+04','2012-06-12 18:33:54.97977+04'); -- этот полностью
insert into test (data_on, data_off) values ('2012-06-12 19:31:01.370128+04','2012-06-12 20:35:07.00101+04'); -- этот не должен войти (не рабочее время)
insert into test (data_on, data_off) values ('2012-06-14 11:15:13.211176+04','2012-06-14 18:40:19.594816+04'); -- этот частично с 11.15 до 15.36 (15.36 конец второго интервала)



задача sql запросом получить примерно такую таблицу пересечений этих интервалов:
2012-06-12 08:00:00.0+04 2012-06-12 15:30:24.104155+042012-06-12 16:30:33.611383+04 2012-06-12 18:33:54.97977+042012-06-14 11:15:13.211176+04 2012-06-14 15:36:50.469214+04

хелп!
...
Рейтинг: 0 / 0
пересечение трёх временных интервалов...?
    #37840848
kkv79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
блин, всю голову уже сломал....

упрощу задачу....

есть 2 временных интервала
первый тот-же, с 8-ми утра до 5-ти вечера каждый день (рабочее время)
а второй интервал - задан датой начала и датой конца.
нужно посчитать количество рабочего времени вошедшего во второй интервал.
...
Рейтинг: 0 / 0
пересечение трёх временных интервалов...?
    #37841080
Author the new one
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kkv79,

У вас тут не интервалы(interval), но диапазоны (range), не надо путать, interval - это просто время какой-то продолжительности, не привязанное к чему-либо.
В 9.2 диапазоны работают из коробки.
У вас, видимо, не 9.2, стало быть, из коробки не работает.
Вы, как я понимаю, хотите найти пересечение двух диапазонов.
Пусть (lo1,hi1) - первый диапазон, а (lo2,hi2) - второй.
Соответственно, искомое пересечение будет lo3=greatest(lo1,lo2), hi3=least(hi1,hi2)
Если lo3>hi3, диапазоны не пересекаются.
...
Рейтинг: 0 / 0
пересечение трёх временных интервалов...?
    #37841556
kkv79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у меня первый "интервал" задан временем без даты
а второй timestamp with time zone
проблема в том, что второй интервал может длиться несколько суток, может начаться например в 13.00 сегодня а завершиться в 11.00 после завтра.
т.е. (с 13.00 до 17.00 = 4 часа сегодня) + (весь рабочий день завтра = 9 часов) + (с 8.00 до 11.00 = 3 часа после завтра) = (16 часов всего)
как в таком случае считать?
...
Рейтинг: 0 / 0
пересечение трёх временных интервалов...?
    #37841622
Author the new one
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kkv79как в таком случае считать?

Да, действительно, как же в таком случае считать? Потрудитесь маленько, подумайте, это дело богоугодное, если чо, а уж если не получается - то вы, скорее всего, занимаетесь чем-то не тем.
...
Рейтинг: 0 / 0
пересечение трёх временных интервалов...?
    #37841984
kkv79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вопрос закрыт.

запросом сделать не удалось, сделал в процедуре....
...
Рейтинг: 0 / 0
пересечение трёх временных интервалов...?
    #37842572
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
with data_on_off ( data_on, data_off ) as (
        values
        ('2012-06-10 07:30:10.346695+04'::timestamp,'2012-06-10 10:30:24.104155+04'::timestamp), -- этот не входит (слишком давно. 10-е число)
        ('2012-06-12 05:30:10.346695+04','2012-06-12 15:30:24.104155+04'), -- этот частично с 8 утра до 15.30
        ('2012-06-12 16:30:33.611383+04','2012-06-12 18:33:54.97977+04'), -- этот полностью
        ('2012-06-12 19:31:01.370128+04','2012-06-12 20:35:07.00101+04'), -- этот не должен войти (не рабочее время)
        ('2012-06-14 11:15:13.211176+04','2012-06-14 18:40:19.594816+04'), -- этот частично с 11.15 до 15.36 (15.36 конец второго интервала)
        ('2012-06-15 11:15:13.211176+04','2012-06-18 18:40:19.594816+04') -- !!! МНОГОДНЕВНЫЙ !!!
), data_and_work_begin as (
        select data_on, data_off,
        generate_series( date_trunc( 'day', data_on ) + '8 hours'::interval, date_trunc( 'day', data_off ) + '1 day'::interval, '1 day'::interval ) as work_begin
        from data_on_off
), data_and_work_begin_end as (
        select data_on, data_off, work_begin, work_begin + '9 hours'::interval as work_end from data_and_work_begin
)
select sum( greatest( least(data_off,work_end) - greatest(data_on,work_begin), '0'::interval ) ) from data_and_work_begin_end
;
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / пересечение трёх временных интервалов...?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]