2009-09-04 8 views
3

va ici une autre question SQL sur les dates ...Fractionnement un intervalle en semaines Postgres

Je construis une application en utilisant PHP et calendrier Postgres qui afficherait des événements couvrant jours, semaines ou mois peut-être. Chaque événement a une date de début et une date de fin, et les sélectionner par plage n'est pas un problème; Cependant, il serait utile pour moi que Postgres divise les événements de plusieurs semaines au premier jour de chaque semaine. On m'a dit qu'il peut être fait en utilisant GROUP BY et EXTRACT, mais je ne suis pas assez bon avec SQL pour comprendre comment.

La question est: cela peut-il être fait, et à quoi ressemblerait la requête précise? Actuellement, j'utilise SELECT * FROM events WHERE (range) OVERLAPS (range); et ensuite faire le fractionnement en PHP, mais ce n'est clairement pas optimal.

Répondre

3

Vous pouvez utiliser la fonction Postgres generate_series. En 8.3 et plus tôt, faire des choses comme

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

En 8.4, vous pouvez également faire

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

Merci, je ne connaissais pas 'generate_series'. J'utilise actuellement le 8.3, donc je suppose que je devrais passer en 8.4 pour vraiment utiliser la fonction, car appliquer l'exemple 8.3 aux dates semble un peu difficile. – slikts

+1

Ce n'est pas si difficile si vous combinez generate_series avec un intervalle de '1 jour'; Il y a un bon exemple de ce genre de choses sur une base mensuelle à http://www.mail-archive.com/[email protected]/msg134699.htmlbv –

1

tout d'abord - il serait bon de montrer une entrée de l'échantillon et la sortie de la requête que vous feriez comme nous pour vous aider - je ne sais pas, par exemple, ce dont vous avez réellement besoin.

Aussi - vous pourriez trouver que OVERLAPS est sous-optimal, car il n'est pas indexable. Au lieu de cela, vous pouvez utiliser la méthode décrite dans this blog post.

+0

Désolé d'être pas clair. Voici un exemple des résultats que ma requête renvoie actuellement: . Les deux derniers événements s'étendent sur plusieurs mois, et j'aimerais les diviser en autant d'événements qu'il y a de premiers jours de la semaine dans cette fourchette. Par exemple: . – slikts

+0

Désolé, les URL sont brisées. Ce sont les bonnes: * http://pastebin.com/d5021e30d * http://pastebin.com/d758bf244 – slikts

Questions connexes