Oracle
 sql >> Base de données >  >> RDS >> Oracle

Recherche de dates entre deux dates (Bonne pratique)

Vous demandez les meilleures pratiques. Je pense que ce qui suit est la meilleure pratique :

"Date" >= DATE '2014-04-11' AND "Date" < DATE '2014-04-12' + 1

Tout d'abord, notez l'utilisation de la DATE mot-clé. Votre question concerne les dates et pourtant vous utilisez un format de date qu'Oracle ne prend pas directement en charge. Heureusement, Oracle prend en charge la norme ANSI DATE mot-clé au format standard ISO.

Deuxièmement, j'ai ajouté un +1 afin que vous puissiez voir la fin de la période, ce qui est probablement ce que vous voulez voir dans le code. Cela ne devrait pas affecter les performances car le + 1 est sur une constante.

Troisièmement, une constante de date a une composante temporelle. Si aucun n'est spécifié, il est minuit le jour. Donc, l'expression :

"Date" BETWEEN '2014-04-11' AND '2014-04-12'

Est vraiment :

"Date" >= TIMESTAMP '2014-04-11 00:00:00' AND "Date" <= TIMESTAMP '2014-04-12 00:00:00'

C'est-à-dire qu'exactement une heure à partir de la date ultérieure est incluse, le premier instant à minuit. Ce n'est généralement pas ce que vous voulez. Oracle aggrave ce problème de deux manières :

  1. La date le type de données inclut une composante temporelle.
  2. La manière par défaut de présenter date les valeurs n'ont pas de composante temporelle.

Donc, pour être plus sûr, utilisez les règles suivantes :

  • Ne pas utiliser between aux dates.
  • Utilisez >= pour le premier rendez-vous.
  • Utilisateur < pour le second.

Aaron Bertrand a un blog exactement sur ce sujet. Bien qu'il s'agisse spécifiquement de SQL Server, de nombreuses idées s'appliquent à Oracle, en particulier parce que la date le type de données dans Oracle inclut les heures.