powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Генератор периодов
4 сообщений из 4, страница 1 из 1
Генератор периодов
    #38699310
big-trot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Задан временной интервал: 01.11.2010 - 17.06.2014. Необходимо этот временной интервал разбить на (допустим) недели. Написан следующий навороченный запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
WITH t1 AS
(
    SELECT
        generate_series(extract(year from '01.11.2010'::DATE)::INTEGER, extract(year from '17.06.2014'::DATE)::INTEGER) as year_p
)
,t2 as (
	SELECT 
        generate_series(1, 52) as day_p, year_p
	FROM t1    
)
,t3 as (
	SELECT *, ('01.01.'||year_p)::DATE + 7 * (day_p *  INTERVAL'1 day' - INTERVAL'1 day') as date_all FROM t2 
)
SELECT day_p, year_p FROM t3 
WHERE date_all > '01.11.2010'::DATE AND date_all < '17.06.2014'::DATE


Есть ли другие вариант более лаконичные. Спасибо.
...
Рейтинг: 0 / 0
Генератор периодов
    #38699459
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
with w as (select generate_series(date_trunc('week', date '01.11.2010'), date '17.06.2014', interval '1 week') as b)
select date_part('week', b) as day_p, date_part('year', b) as year_p from w;
...
Рейтинг: 0 / 0
Генератор периодов
    #38699490
big-trot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LeXa NalBat

Спасибо.
...
Рейтинг: 0 / 0
Генератор периодов
    #38699917
Морган
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот когда то давно писал для получения различных интервалов.

Код: plsql
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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
select
    *
from (
    with 
    tim as 
    (
        select *
        from
            (values
                ('08:00'::interval,'20:00'::interval,1), -- с 8:00 до 20:00
                ('20:00'::interval,'32:00'::interval,2), -- с 20:00 до 8:00
                ('20:00'::interval,'44:00'::interval,3), -- с 20:00 до 20:00
                ('08:00'::interval,'32:00'::interval,4)  -- с 8:00 до 8:00
            ) as cc (first, last, type_int)
        where type_int = any(string_to_array('1,2,3,4', ',')::int4[])
    ),
    tim2 as 
    (
        select 
            ((id)::text || ' day')::interval as id, 
            tim.*
        from generate_series(0, '2014-02-02'::date - '2014-01-15'::date) as some_table (id)
        cross join tim
        order by 1, 2
    )
    select 
        ('2014-01-15'::date+(id + first)) as first_date,
        ('2014-01-15'::date+(id + last)) as last_date
    from tim2
    ) x
where
    x.first_date >= '2014-01-15'::datetime and 
    x.last_date <= '2014-02-02'::date + '23:59:59'::time
order by 1
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Генератор периодов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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