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

¿Cómo recopilar la zona horaria del sistema operativo de la base de datos Oracle en formato de cadena? (Migrar/convertir fecha a ts con tz)

Si los datos ya están en una tabla SQL de Oracle y debe convertirlos a una marca de tiempo con zona horaria (por ejemplo, en una nueva columna que creó en la misma tabla), no necesita ir explícitamente al sistema operativo ni a use Java o cualquier otra cosa, que no sea la propia base de datos de Oracle.

No queda claro a partir de su pregunta si debe asumir que la "fecha" estaba destinada a estar en la zona horaria del servidor (menciona "la base de datos", que normalmente significa el servidor) o la zona horaria del cliente (menciona "sesión" que significa el cliente). De cualquier manera:

update <your_table>
set <timestamp_with_time_zone_col> = 
            from_tz(cast<date_col> as timestamp, dbtimezone)
;

o usa sessiontimezone como segundo argumento, si eso es lo que necesita.

Esto supone que la zona horaria de la base de datos (y/o la sesión) está configurada correctamente en la base de datos, respectivamente, en el cliente. Si no es / no lo son, eso debe arreglarse primero. Oracle es perfectamente capaz de manejar el horario de verano, si los parámetros se configuran correctamente en primer lugar. (Y si no lo son, no está claro por qué intentaría que su operación fuera "más correcta" de lo que admite la base de datos en primer lugar).

Ejemplo:en la cláusula WITH a continuación, simulo una tabla con una columna dt en el tipo de datos date . Luego lo convierto para que sea una timestamp with time zone , en la zona horaria de mi sesión (cliente).

with
  my_table ( dt ) as ( 
    select to_date('2018-06-20 14:30:00', 'yyyy-mm-dd hh24:mi:ss') from dual 
  )
select dt,
       from_tz(cast(dt as timestamp), sessiontimezone) as ts_with_tz
from   my_table
;

DT                  TS_WITH_TZ                                       
------------------- -------------------------------------------------
2018-06-20 14:30:00 2018-06-20 14:30:00.000000000 AMERICA/LOS_ANGELES