PostgreSQL - Filtrer une plage de dates
Je suis un SQL developer et passe la plupart de mon temps dans MSSQL.
Je suis à la recherche d'une meilleure façon de filtrer un "Timestamp sans fuseau horaire" dans un champ de PostgreSQL DB.
Je suis en utilisant:
Where
DateField >= '2010-01-01' and
DateField < '2012-01-01'
Mais étant donné que je ne suis pas un expert au niveau de la syntaxe je pense qu'il y a une meilleure façon.
Des Suggestions? Merci.
Quel est le problème avec cela de toute façon? Vous pouvez utiliser
Il est préférable de spécifier explicitement le format de la date.
C'est bien, c'est juste la course de long. J'ai fait sûr qu'il y a un index sur le champ, mais il est juste de prendre beaucoup plus de temps que je suis habitué.
Je n'ai jamais eu de problèmes avec la comparaison des dates comme ça et je ne trouve normalement pas d'index de mes dates. @Prive travaillez-vous avec ridiculement grandes quantités de données? Êtes-vous joindre à un groupe de tables?
Un tableau que j'ai hérité. Je m'attends à environ 3 à 4 Mil lignes retournées.
between 2010-01-01
et 2012-01-01", mais c'est presque la même chose, vraiment. Est-il une meilleure façon de le faire avec MSSQL (je n'ai jamais utilisé)?Il est préférable de spécifier explicitement le format de la date.
C'est bien, c'est juste la course de long. J'ai fait sûr qu'il y a un index sur le champ, mais il est juste de prendre beaucoup plus de temps que je suis habitué.
Je n'ai jamais eu de problèmes avec la comparaison des dates comme ça et je ne trouve normalement pas d'index de mes dates. @Prive travaillez-vous avec ridiculement grandes quantités de données? Êtes-vous joindre à un groupe de tables?
Un tableau que j'ai hérité. Je m'attends à environ 3 à 4 Mil lignes retournées.
OriginalL'auteur Rob S | 2013-04-04
Vous devez vous connecter pour publier un commentaire.
Votre solution est parfaite. Si les dates sont des littéraux, je préfère, si:
Effectue exactement la même, mais il est plus maintenable, parce qu'il indique clairement le point de chaque littéral de "date" être un timestamp, pas une date. Par exemple, supposons que parfois quelqu'un change votre requête à la suivante
... attend (et l'échec) d'inclure la totalité de la journée "2012-01-01" dans la requête. En ce qui concerne la syntaxe, l'intention est plus clair et cette confusion est évitée.
Pour le rendre encore plus clair (peut-être trop verbeux), vous pouvez faire la conversion explicite:
Je ne voudrais pas utiliser
to_date()
ici pour des raisons similaires (potentiel de type de données de la confusion), nito_timestamp()
(elle renvoie untimestamptz
).BTW, j'ai modifié les cas pour se conformer à la pratique recommandée (mots clés en majuscules, les identifiants en minuscules)
OriginalL'auteur leonbloy
Pour les intervalles de date, vous pouvez utiliser quelque chose comme:
Il est plus court (vous n'avez pas besoin de répéter
DateField
), et a explicite format de la date.Pour 1 heure/jour/mois/année, vous pouvez utiliser:
between
n'est pas le même que>= and <
car il comprend deux extrémités.Pour l'horodatage (mentionné dans la question) la différence est en une milliseconde.
OriginalL'auteur Igor Romanchenko
Vous pouvez garder la requête simple en utilisant
BETWEEN
tant que votre nom de la colonne est de typeTIMESTAMP
et 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'
Cela fonctionne pour les dates '2018-12-30" et la date et l'heure '2018-12-30 02:19:34'.
OriginalL'auteur Phil Andrews