web-dev-qa-db-fra.com

PostgreSQL - Filtrer une plage de dates

Je suis un développeur SQL et je passe la plupart de mon temps dans MSSQL. Je cherche un meilleur moyen de filtrer un champ "Horodatage sans fuseau horaire" dans une base de données PostgreSQL.

J'utilise:

Where 
DateField >= '2010-01-01' and 
DateField < '2012-01-01'

Mais étant donné que je ne suis pas un expert en syntaxe, je dois penser qu'il existe un meilleur moyen.

Aucune suggestion? Merci.

10
Rob S

Votre solution est bien. Si les dates sont littérales, je préférerais cependant:

WHERE datefield >= '2010-01-01 00:00:00' 
 AND  datefield <  '2012-01-01 00:00:00'

Cela fonctionne exactement de la même manière, mais est plus facile à maintenir, car il indique clairement que chaque "date" littérale est un horodatage et non une date. Par exemple, supposons que quelqu'un modifie parfois votre requête comme suit:

    AND  datefield <=  '2012-01-01'

... attend (et échoue) d'inclure la journée complète "2012-01-01" dans la requête. Avec la syntaxe plus récente, l'intention est plus claire et cette confusion est évitée.

Pour le rendre encore plus clair (peut-être trop verbeux), vous pouvez faire le casting explicite:

WHERE datefield >= '2010-01-01 00:00:00'::timestamp 
 AND  datefield <  '2012-01-01 00:00:00'::timestamp

Je ne voudrais pas utiliser to_date() ici pour des raisons similaires (confusion potentielle de type de données), ni to_timestamp() (il renvoie une timestamptz).

BTW, j'ai modifié le cas pour le rendre conforme à la pratique recommandée (mots clés en majuscules, identifiants en minuscules)

24
leonbloy

Pour les intervalles de dates, vous pouvez utiliser quelque chose comme:

WHERE DateField BETWEEN to_date('2010-01-01','YYYY-MM-DD') 
                    AND to_date('2010-01-02','YYYY-MM-DD')

Il est plus court (vous n'avez pas besoin de répéter DateField) et a un format de date explicite.

Pendant 1 heure/jour/mois/année, vous pouvez utiliser:

WHERE date_trunc('day',DateField) = to_date('2010-01-01','YYYY-MM-DD')
4
Igor Romanchenko

Vous pouvez garder la requête simple en utilisant BETWEEN tant que votre nom de colonne est de type TIMESTAMP et que votre nom de colonne n'est pas "timestamp" ...

SELECT * FROM table WHERE column BETWEEN '2018-12-30 02:19:34' AND '2018-12-30 02:25:34'

Ceci fonctionne pour les dates '2018-12-30' et les dates '2018-12-30 02:19:34'.

0
Phil Andrews