Oracle
 sql >> Database >  >> RDS >> Oracle

Come raccogliere il fuso orario del sistema operativo dal database Oracle in formato stringa? (Migra/converti la data in ts con tz)

Se i dati sono già in una tabella Oracle SQL ed è necessario convertire in un timestamp con fuso orario (ad esempio, in una nuova colonna creata nella stessa tabella), non è necessario accedere esplicitamente al sistema operativo o a utilizzare Java o qualsiasi altra cosa, diversa dal database Oracle stesso.

Non è chiaro dalla tua domanda se devi presumere che la "data" dovesse trovarsi nel fuso orario del server (menziona "il database" che normalmente significa il server) o il fuso orario del client (menziona "sessione" che significa il cliente). Ad ogni modo:

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

oppure usa sessiontimezone come secondo argomento, se è quello che ti serve.

Ciò presuppone che il fuso orario del database (e/o della sessione) sia impostato correttamente nel db, rispettivamente nel client. Se non lo è / non lo sono, è necessario prima risolverlo. Oracle è perfettamente in grado di gestire l'ora legale, se innanzitutto i parametri sono impostati correttamente. (E se non lo sono, non è chiaro il motivo per cui dovresti provare a fare in modo che la tua operazione sia "più corretta" di quella supportata dal database in primo luogo.)

Esempio:nella clausola WITH seguente, simulo una tabella con una colonna dt nel tipo di dati date . Quindi lo converto in un timestamp with time zone , nel fuso orario (client) della mia sessione.

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