PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 20/09/2014 12:30:24

CHR
Membre

[RESOLU] VERLAPS fonction exclut une date

Bonjour,

De retour dans les query Postgresql, j'ai utilisé l'excellente fonction "OVERLAPS" comme suit :

where
(DATE '2014-06-01', DATE '2014-06-30') OVERLAPS
(c3.date_begin, case when c3.date_end is null then '2014-06-30' else c3.date_end end)

Par contre, j'ai un enregistrement où date_begin est '2014-06-30' et date_end '2014-08-25', cet enregistrement est exclu alors qu'il est dans ma range.
Aurai-je manqué un paramètre overlaps pour dire de prendre tout y compris les limites début, fin indiquées ?

Merci pour votre aide,
Chr

Dernière modification par CHR (20/09/2014 13:06:51)

Hors ligne

#2 20/09/2014 13:02:25

rjuju
Administrateur

Re : [RESOLU] VERLAPS fonction exclut une date

Bonjour,

Il s'agit du comportement standard, comme indiqué dans la documentation "Chaque période de temps est considérée représentant l'intervalle à moitié ouvert début1 <= longueur1 < fin2, sauf si début1 et fin2 sont identiques, auquel cas ils représentent une instant précis. Cela signifie en fait que deux périodes de temps avec seulement un point final en commun ne se surchargent pas." (voir http://docs.postgresql.fr/9.3/functions-datetime.html).

Hors ligne

#3 20/09/2014 13:05:45

CHR
Membre

Re : [RESOLU] VERLAPS fonction exclut une date

Merci beaucoup, toujours aussi rapides, c'est cool !
Entre-temps je travaille sur les dates pour les comparer et, le cas échéant, réduire la date de début d'un jour.
En query seul ça fonctionne mais comme c'est imbriqué, c'est pas encore gagné, mais puisque j'ai réussi à faire fonctionner la sous-requête, rien n'est désespéré !
Encore merci !
Je mets le point résolu.

Hors ligne

#4 20/09/2014 14:49:56

rjuju
Administrateur

Re : [RESOLU] VERLAPS fonction exclut une date

Au passage, si vous êtes en version 9.2 ou plus, vous pouvez utiliser le type de données range, avec lequel il est possible de spécifier si les intervalles sont ouverts ou fermés.

Exemple:

select daterange('2014-06-01','2014-06-30','[)')
&&
daterange('2014-06-30','2014-08-01','[]');
 ?column?
----------
 f
(1 row)


select daterange('2014-06-01','2014-06-30','[]')
&&
daterange('2014-06-30','2014-08-01','[]');
 ?column?
----------
 t
(1 row)

Voir http://docs.postgresql.fr/9.3/functions-range.html.

Hors ligne

#5 20/09/2014 17:51:04

CHR
Membre

Re : [RESOLU] VERLAPS fonction exclut une date

Cool, sauf que l'on tourne en 9.1.4... c'est déjà mieux qu'en janvier, nous étions en début d'année à la 8.1 !

Pour ceux qui n'ont pas non plus la 9.2, j'ai utilisé un CASE WHEN dans le OVERLAPS :
(case when date_begin = '2014-06-30' then date_begin - interval '1 day' else date_begin end, case when date_end is null then '2014-06-30' else date_end ::date end)

Et ça fonctionne très bien, mais évidement c'est un peu plus long et moins facile pour le contrôle.
Merci encore !

Hors ligne

Pied de page des forums