2009-09-04 4 views
3

Здесь идет еще один SQL вопрос о сроках ...Разделения интервала в течение нескольких недель в Postgres

Я строй приложения календарное с помощью PHP и Postgres, которые будут отображать события, охватывающие дни, неделю или, возможно, месяцы. Каждое событие имеет дату начала и дату окончания, и выбор их по диапазону не является проблемой; однако мне было бы полезно, если Postgres может разделить многонедельные события в первый день каждой недели. Мне сказали, что это можно сделать, используя GROUP BY и EXTRACT, но я недостаточно разбираюсь в SQL, чтобы понять, как это сделать.

Вопрос в следующем: может ли это быть сделано, и каков будет точный запрос? В настоящее время я использую SELECT * FROM events WHERE (range) OVERLAPS (range); а затем делать расщепление в PHP, но это явно не оптимально.

ответ

3

Вы можете использовать функцию Postgres generate_series. В 8.3 и более ранние версии, делать такие вещи, как

select current_date + s.a as dates from generate_series(0,14,7) as s(a); 

В 8.4, вы также можете сделать

SELECT * FROM generate_series('2008-03-01 00:00'::timestamp, 
           '2008-03-04 12:00', '10 hours'); 
+0

Спасибо, я не знал о 'generate_series'. В настоящее время я использую 8.3, поэтому, я думаю, мне придется переключиться на 8.4, чтобы действительно использовать эту функцию, потому что применение примера 8.3 к датам кажется немного трудным. – slikts

+1

Это не так сложно, если вы комбинируете generate_series с интервалом в 1 день; есть хороший пример того, чтобы делать такие вещи ежемесячно на http://www.mail-archive.com/[email protected]/msg134699.htmlbv –

1

Прежде всего - это было бы хорошо, чтобы показать некоторые входные выборки и вывода запроса, который бы как мы, чтобы помочь вам - я, например, действительно не понимаю, что вам нужно.

Кроме того, вы можете обнаружить, что OVERLAPS является субоптимальным, поскольку он не является индексируемым. Вместо этого вы можете использовать метод, описанный мной в this blog post.

+0

Извините, что неясно. Это пример результатов, которые возвращает мой запрос: . Последние два события охватывают несколько месяцев, и я хотел бы разделить их на столько событий, сколько есть первые дни недели внутри этого диапазона. Например: . – slikts

+0

Извините, URL-адреса нарушены. Это правильные: * http://pastebin.com/d5021e30d * http://pastebin.com/d758bf244 – slikts