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

¿Cómo obtengo esta marca de tiempo en el formato que quiero, Oracle SQL?

Como dijo @Gordon, las marcas de tiempo (y las fechas) no se almacenan en un formato que reconocería Oracle usa una representación interna que nunca necesita conocer o examinar (pero está documentada si está interesado en ese tipo de cosas) .

Cuando consulta una marca de tiempo, se muestra usando la configuración NLS de su cliente, a menos que tenga un cliente que los anule. Puedo configurar mi sesión para que coincida con lo que está viendo:

alter session set nls_timestamp_format = 'DD-MON-RR HH.MI.SS.FF AM';

select to_char(systimestamp, 'YYYY-MM-DD HH24:MI:SS') from dual;

TO_CHAR(SYSTIMESTAM
-------------------
2018-07-10 15:37:31

select to_timestamp(to_char(systimestamp, 'YYYY-MM-DD HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS') from dual;

TO_TIMESTAMP(TO_CHAR(SYSTIMESTA
-------------------------------
10-JUL-18 03.37.31.000000000 PM

Y puedo cambiarlo mira lo que quieres ver:

alter session set nls_timestamp_format = 'YYYY-MM-DD HH24:MI:SS';

select to_timestamp(to_char(systimestamp, 'YYYY-MM-DD HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS') from dual;

TO_TIMESTAMP(TO_CHA
-------------------
2018-07-10 15:37:32

Pero todo lo que está haciendo es convertir desde una marca de tiempo con zona horaria (que es lo que systimestamp es) a una cadena y luego de vuelta a una marca de tiempo. Está perdiendo la parte de la zona horaria y cualquier fracción de segundo; que también podrías hacer con un cast :

select cast(systimestamp as timestamp(0)) from dual;

CAST(SYSTIMESTAMPAS
-------------------
2018-07-10 15:37:32

Puede ver la zona horaria y las fracciones de segundo con su timestamp_tz predeterminado formato:

select systimestamp from dual;

SYSTIMESTAMP                        
------------------------------------
2018-07-10 15:37:33.776469000 +01:00

y cámbielo con un alter diferente :

alter session set nls_timestamp_tz_format = 'YYYY-MM-DD HH24:MI:SS.FF3 TZH:TZM';

select systimestamp from dual;

SYSTIMESTAMP                  
------------------------------
2018-07-10 15:37:34.070 +01:00

Lo cual no es del todo relevante si realmente está hablando de almacenar marcas de tiempo en una tabla, pero muestra que hay variaciones.

En su tabla, haga el tipo de datos timestamp (o timestamp with time zone o timestamp with local time zone ), y solo preocúpese por formatear el valor como una cadena para presentarlo al usuario final, en el último momento posible.

Cuando necesite mostrarlo, si el formato de visualización es importante para usted, use to_char() con una máscara de formato explícita:no asuma que cualquier otra persona que ejecute sus consultas tendrá la misma configuración de NLS. Como puede ver, es fácil cambiarlos para modificar la salida. (La mayoría de los clientes tienen una forma de permitirle establecer los valores predeterminados para que no tenga que hacer lo mismo alter comandos cada vez que te conectas; p.ej. en SQL Developer, desde Herramientas->Preferencias->Base de datos->NLS). Si desea mostrar siempre el mismo formato, utilice algo como:

select to_char(your_column, 'YYYY-MM-DD HH24:MI:SS') as column_alias
from your_table
where your_column < timestamp '2018-01-01 00:00:00'

que también muestra el valor de la columna que se filtra (como una marca de tiempo fija) usando un literal de marca de tiempo.