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

SQL- ¿Diferencia entre TIMESTAMP, DATE Y TIMESTAMP CON TIMEZONE?

Los tipos de datos y las diferencias entre ellos están en la documentación . La versión corta es:

  • FECHA tiene una precisión de hasta un segundo sin soporte de zona horaria;
  • TIMESTAMP tiene una precisión de fracciones de segundo (hasta nueve decimales, pero su sistema operativo también afecta eso), aún sin soporte de zona horaria;
  • TIMESTAMP WITH TIME ZONE tiene la misma precisión que TIMESTAMP pero también es compatible con la zona horaria, como sugiere el nombre;
  • TIMESTAMP CON ZONA HORARIA LOCAL ajusta el valor almacenado hacia y desde la zona horaria local de la sesión de creación/consulta.

Puede encontrar este artículo interesante también.

Siempre que compare valores de fecha y hora almacenados en su base de datos, debe usar valores del mismo tipo de datos para comparar. No desea tener que convertir todos los valores de la columna para compararlos, especialmente si la columna está indexada. Si tiene una columna de FECHA, compárela con una FECHA; no compare como una cadena y no confíe en conversión de una cuerda Cuando lo haces:

WHERE date_col BETWEEN '01-JAN-1990' AND '01-JAN-2000'

confía en que su NLS_DATE_FORMAT sea DD-MON-YYYY y su NLS_DATE_LANGUAGE sea inglés. Si alguien más ejecuta la misma consulta en otra sesión, su configuración puede hacer que la consulta falle (o, en algunos casos, dar resultados incorrectos, lo que puede ser peor). Para evitar el problema del idioma, es mejor usar números de meses en lugar de nombres. Si tiene una variable de cadena con la que comparar, debe usar TO_DATE() para convertir la cadena a una FECHA usando una máscara de formato conocida fija, no confíe en NLS. Si tiene un valor fijo, puede hacer lo mismo, o puede usar un literal de fecha , que es más breve y sin ambigüedades.

Con el formato que usó, también incluye las filas que tienen una columna establecida en la medianoche del 1 de enero de 2000, pero no más tarde ese día. Eso puede ser lo que quieres, pero asegúrate de entender cómo BETWEEN obras. Si realmente está buscando fechas dentro de esa década, incluso en cualquier momento el 31 de diciembre de 1999, puede usar:

WHERE date_col >= DATE '1990-01-01' AND date_col < DATE '2000-01-01'

Para las marcas de tiempo, puede usar TO_TIMESTAMP() o un literal de marca de tiempo:

WHERE ts_col >= TIMESTAMP '1990-01-01 00:00:00'
AND ts_col < TIMESTAMP '2000-01-01 00:00:00'

Para marcas de tiempo con zonas horarias, puede usar TO_TIMESTAMP_TZ() o un literal de marca de tiempo, con una región de zona horaria de nombres:

WHERE tstz_col >= TIMESTAMP '1990-01-01 00:00:00 America/New_York'
AND tstz_col < TIMESTAMP '2000-01-01 00:00:00 America/New_York'