powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Разбиение периода времени на часовые интеравалы
7 сообщений из 7, страница 1 из 1
Разбиение периода времени на часовые интеравалы
    #34499024
ffk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ffk
Гость
Доброго времени суток.
Помогите оформить все одним SQL запросом, можно с использование ХП, главное чтобы не делать никаких вычислений на стороне клиента.
А задача така. Есть таблица с полями ID, начало сессии, конец сесии. Что-то типа

ID| session_begin| session_end
-----------------------------
1 | 30.04.2007 15:43 | 01.05.2007 20:34
2 | 30.04.2007 23:10 | 02.05.2007 08:12

Надо разбить интервал [session_begin, session_end] на часы чтобы получилось так:
ID| session_begin| session_end
-----------------------------
1 | 30.04.2007 15:43 | 30.04.2007 16:00
1 | 30.04.2007 16:00 | 30.04.2007 17:00
1 | 30.04.2007 16:00 | 30.04.2007 17:00
1 | 30.04.2007 17:00 | 30.04.2007 18:00
.....
1 | 01.04.2007 20:00 | 01.05.2007 20:34
2 | 30.04.2007 23:10 | 01.05.2007 00:00
2 | 01.05.2007 00:00 | 01.05.2007 01:00
...
2 | 02.05.2007 08:00 | 02.05.2007 08:12

Это надо для того чтобы можно было получить распределение загружености на часам с дополнительными условиями. Например Загруженость за последний месяц, только четные дни или только с пятницы до воскресенья.

Как делать группировки и суммировая я знаю, не знаю только как разделить один интервал на несколько записей.

Или может кто-нибудь предложит другое решение данной проблемы?

P.S. Поля session_begin и session_end хранятся как intger unix timestamp, перевести их в postgres timestamp не проблема.
...
Рейтинг: 0 / 0
Разбиение периода времени на часовые интеравалы
    #34499096
Serik Akhmetov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ffkне знаю только как разделить один интервал на несколько записей.Я бы написал ХП, у которой на входе диапазон, на выходе нужное кол-во строк по часам. А потом ее можно join.
...
Рейтинг: 0 / 0
Разбиение периода времени на часовые интеравалы
    #34500811
Skif Swarogich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может что-то типа:
date_trunc(''hour'',time_begin) ?
...
Рейтинг: 0 / 0
Разбиение периода времени на часовые интеравалы
    #34500869
Kruchinin Pahan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ffkДоброго времени суток.
Помогите оформить все одним SQL запросом, можно с использование ХП, главное чтобы не делать никаких вычислений на стороне клиента.
А задача така. Есть таблица с полями ID, начало сессии, конец сесии. Что-то типа

Можно так попробовать:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
CREATE TABLE "public"."tst" (
  "key" SERIAL,
  "dt1" TIMESTAMP WITHOUT TIME ZONE,
  "dt2" TIMESTAMP WITHOUT TIME ZONE
) WITH OIDS;

INSERT INTO "public"."tst" ("dt1", "dt2")
VALUES ('2007-05-01 00:00:00', '2007-05-01 03:15:01');

INSERT INTO "public"."tst" ("dt1", "dt2")
VALUES ('2007-05-03 08:10:00', '2007-05-03 12:55:00');

INSERT INTO "public"."tst" ("dt1", "dt2")
VALUES ('2007-05-02 05:10:01', '2007-05-03 00:17:00');

SELECT Ser.*,
       Date_Trunc('Hour', Ser.Dt1) + (Trim(Series) || ' Hour')::InterVal
FROM
(SELECT Main.*,
       Generate_Series( 1 , IntrVal) -  1  AS Series
FROM
(SELECT Tst.*,
       (Date_Trunc('Day', Tst.Dt2)::Date - Date_Trunc('Day', Tst.Dt1)::Date) *  24  +
       Extract(Hour FROM (Tst.Dt2 - Tst.Dt1))::Int4 AS IntrVal
FROM Tst) Main) Ser
Тока хранимка, кажись, быстрее будет работать все-таки.
...
Рейтинг: 0 / 0
Разбиение периода времени на часовые интеравалы
    #34501023
ffk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ffk
Гость
Skif Swarogich: нет это совсем не то.

Kruchinin Pahan: Огромное спасибо, после небольших исправлений данный вариант заработал!

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT Ser.*,
	(Date_Trunc('Hour', Ser.Dt1) + (Trim(Series) || ' Hour')::InterVal) AS interval_timestamp
FROM
(SELECT Main.*,
       Generate_Series( 1 , IntrVal) -  1  AS Series
FROM
(SELECT Tst.*, 
       (EXTRACT('day' from dt2-dt1) *  24 )::integer +
       Extract(Hour FROM (
	date_trunc('hour', Tst.Dt2+INTERVAL '2 hour') - date_trunc('hour', Tst.Dt1)))::Int4 AS IntrVal
FROM Tst)Main)Ser

Вот его Explain:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Subquery Scan ser  (cost=0.00..14483.52 rows=50376 width=56)
  ->  Seq Scan on comp_sessions  (cost=0.00..13224.12 rows=50376 width=37)
        SubPlan
          ->  Result  (cost=0.00..0.02 rows=1 width=0)
          ->  Result  (cost=0.00..0.02 rows=1 width=0)
          ->  Result  (cost=0.00..0.02 rows=1 width=0)
          ->  Result  (cost=0.00..0.02 rows=1 width=0)
          ->  Result  (cost=0.00..0.02 rows=1 width=0)
          ->  Result  (cost=0.00..0.02 rows=1 width=0)
          ->  Result  (cost=0.00..0.02 rows=1 width=0)
          ->  Result  (cost=0.00..0.02 rows=1 width=0)
          ->  Result  (cost=0.00..0.02 rows=1 width=0)
          ->  Result  (cost=0.00..0.02 rows=1 width=0)

Не знаю, стоит ли заморачиваться на счет ХП, т.к. ХП никогда не писал.
...
Рейтинг: 0 / 0
Разбиение периода времени на часовые интеравалы
    #34502027
ffk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ffk
Гость
Вот более правильный вариант этого, может кому-нибудь пригодиться
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT *,
	GREATEST('0'::INTERVAL, LEAST(interval_timestamp + '1 hour'::INTERVAL, dt2) - GREATEST(interval_timestamp,  dt1)) AS length
FROM (
SELECT Ser.*,
	(Date_Trunc('Hour', Ser.Dt1) + (Trim(Series) || ' Hour')::InterVal) AS interval_timestamp
FROM
(SELECT Main.*,
       Generate_Series( 1 , IntrVal) -  1  AS Series
FROM
(SELECT Tst.*, 
       (EXTRACT('day' from dt2-dt1) *  24 )::integer +
       Extract(Hour FROM dt2-dt1)::Int4 +  1  + (CASE WHEN date_trunc('hour', dt2) != date_trunc('hour', dt1) THEN  1  ELSE  0  END)AS IntrVal
FROM Tst)Main)Ser) Res where intrval >  24 
...
Рейтинг: 0 / 0
Разбиение периода времени на часовые интеравалы
    #34502033
Kruchinin Pahan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ffkНе знаю, стоит ли заморачиваться на счет ХП, т.к. ХП никогда не писал.
Если скорость работы устраивает, то заморачиваться не стоит. А вот если данные собираются накапливаться в больших количествах, то возможно будет достигнута некоторая критическая масса, когда хранимка будет работать на порядок быстрее запроса.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Разбиение периода времени на часовые интеравалы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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