Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Генератор периодов / 4 сообщений из 4, страница 1 из 1
17.07.2014, 15:58:06
    #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
17.07.2014, 17:10:58
    #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
17.07.2014, 17:29:15
    #38699490
big-trot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генератор периодов
LeXa NalBat

Спасибо.
...
Рейтинг: 0 / 0
18.07.2014, 09:06:45
    #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
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Генератор периодов / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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