Выборка дат

kode

never knows best
Выборка дат

Проблема такая: есть таблица, назовём её events

у неё есть поля

startdate(timestamp)|enddate(timestamp) (ненужные нам поля (типа id, title,etc) я опустил)

входные данные - год и месяц

данные например могут быть таковы:

2008-05-12|2008-06-01
2008-06-12|2008-06-14
2008-06-16|2008-06-21
2008-06-25|2008-07-23


нужно выбрать даты, в этом году/месяце в которые есть события

те результат должен быть таковым (при 2008/06):

01
12
13
14
16
17
18
19
20
21
25
26
27
28
29
30

-~{}~ 23.06.08 11:16:

Заранее благодарен.

-~{}~ 23.06.08 11:20:

я предчуствую что это нужно делать вложенными запросами

-~{}~ 23.06.08 11:23:

как вариант создать вспомогательнкю табличку, заполненную цифрами от 1-31, а потом через right join и between смотреть, есть ли
 

Gas

может по одной?
добавление промежуточных дат я бы сделал в скрипте.
 

kode

never knows best
ладно, постгрес же, регуляркой с циклом сделаю

-~{}~ 23.06.08 12:03:

в общем получился финт ушами:

SELECT DISTINCT ON(day) day FROM temp_dates, event WHERE to_timestamp($1||'-'||day,'YYYY-MM-DD') BETWEEN to_timestamp(to_char(event.startdate,'YYYY-MM-DD'),'YYYY-MM-DD') AND to_timestamp(to_char(event.enddate,'YYYY-MM-DD'),'YYYY-MM-DD') ORDER BY day;

$1 - '2008-06'

to_timestamp(to_char(event.enddate,'YYYY-MM-DD'),'YYYY-MM-DD') - такие извращения нужны чтобы занулить время (оно почти постоянно отлично от нуля)

теперь помогите оптимизировать
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: kode
как вариант создать вспомогательнкю табличку, заполненную цифрами от 1-31, а потом через right join и between смотреть, есть ли
Вспомогательная табличка не нужна, есть модная функция generate_series():
Код:
select d
from events as e, generate_series(1,30) as d
where ('2008-06-' || d)::date between e.startdate and e.enddate;
-~{}~ 23.06.08 12:13:

ну собственно startdate и enddate тоже надо к дате приводить, без идиотских конструкций
Код:
to_timestamp(to_char(event.enddate,'YYYY-MM-DD'),'YYYY-MM-DD')
впрочем.
 

kode

never knows best
Автор оригинала: Sad Spirit
Вспомогательная табличка не нужна, есть модная функция generate_series():
Код:
select d
from events as e, generate_series(1,30) as d
where ('2008-06-' || d)::date between e.startdate and e.enddate;
-~{}~ 23.06.08 12:13:

ну собственно startdate и enddate тоже надо к дате приводить, без идиотских конструкций
Код:
to_timestamp(to_char(event.enddate,'YYYY-MM-DD'),'YYYY-MM-DD')
впрочем.
Ага, спасибо большое, от позора меня спасли :)
 
Сверху