Se os dados já estiverem em uma tabela Oracle SQL e você precisar converter para um carimbo de data/hora com fuso horário (por exemplo, em uma nova coluna criada na mesma tabela), não será necessário ir explicitamente ao SO ou usar Java ou qualquer outra coisa que não seja o próprio banco de dados Oracle.
Não está claro na sua pergunta se você deve assumir que a "data" deveria estar no fuso horário do servidor (você menciona "o banco de dados" que normalmente significa o servidor) ou o fuso horário do cliente (você menciona "sessão", o que significa o cliente). De qualquer jeito:
update <your_table>
set <timestamp_with_time_zone_col> =
from_tz(cast<date_col> as timestamp, dbtimezone)
;
ou use
sessiontimezone
como segundo argumento, se é isso que você precisa. Isso pressupõe que o fuso horário do banco de dados (e/ou da sessão) esteja configurado corretamente no banco de dados, respectivamente no cliente. Se não for / eles não forem, isso precisa ser corrigido primeiro. O Oracle é perfeitamente capaz de lidar com o horário de verão, se os parâmetros forem definidos corretamente em primeiro lugar. (E se não forem, não está claro por que você tentaria fazer com que sua operação fosse "mais correta" do que o banco de dados suporta em primeiro lugar.)
Exemplo:na cláusula WITH abaixo, simulo uma tabela com uma coluna
dt
no tipo de dados date
. Então eu converto isso para um timestamp with time zone
, no fuso horário da minha sessão (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