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