sql >> Base de Datos >  >> RDS >> Oracle

Encontrar fechas entre dos fechas (mejores prácticas)

Usted está pidiendo mejores prácticas. Creo que la siguiente es la mejor práctica:

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

Primero, tenga en cuenta el uso de DATE palabra clave. Tu pregunta es sobre fechas y, sin embargo, está utilizando un formato de fecha que Oracle no admite directamente. Afortunadamente, Oracle admite el estándar ANSI DATE palabra clave con el formato estándar ISO.

En segundo lugar, agregué un +1 para que pueda ver el final del período de tiempo, que presumiblemente es lo que desea ver en el código. No debería afectar el rendimiento porque + 1 está en una constante.

Tercero, una constante de fecha tiene un componente de tiempo. Cuando no se especifica ninguno, es la medianoche de la fecha. Entonces, la expresión:

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

es realmente:

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

Es decir, se incluye exactamente un tiempo a partir de la fecha posterior, el primer instante a medianoche. Esto no suele ser lo que quieres. Oracle empeora este problema de dos formas:

  1. La date el tipo de datos incluye un componente de tiempo.
  2. La forma predeterminada de presentar date valores no tiene componente de tiempo.

Entonces, para estar más seguro, use las siguientes reglas:

  • No utilice between en fechas.
  • Usar >= para la primera cita.
  • Usuario < para el segundo.

Aaron Bertrand tiene un blog exactamente sobre este tema. Aunque se trata específicamente de SQL Server, muchas de las ideas se aplican a Oracle, especialmente porque la date el tipo de datos en Oracle incluye tiempos.