Vous n'êtes pas identifié(e).
Pages : 1
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
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).
Julien.
https://rjuju.github.io/
Hors ligne
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
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)
Julien.
https://rjuju.github.io/
Hors ligne
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
Pages : 1