Jeśli dane znajdują się już w tabeli Oracle SQL i musisz dokonać konwersji na znacznik czasu ze strefą czasową (na przykład w nowej kolumnie utworzonej w tej samej tabeli), nie musisz bezpośrednio przechodzić do systemu operacyjnego ani do używać Javy lub jakiejkolwiek innej rzeczy, innej niż sama baza danych Oracle.
Z twojego pytania nie wynika jasno, czy musisz założyć, że „data” miała być w strefie czasowej serwera (wspominasz „baza danych”, co zwykle oznacza serwer) czy w strefie czasowej klienta (wspominasz „sesję”, co oznacza Klient). Tak czy inaczej:
update <your_table>
set <timestamp_with_time_zone_col> =
from_tz(cast<date_col> as timestamp, dbtimezone)
;
lub użyj sessiontimezone
jako drugi argument, jeśli tego potrzebujesz.
Zakłada się, że strefa czasowa bazy danych (i/lub sesji) jest prawidłowo skonfigurowana w db lub odpowiednio w kliencie. Jeśli tak nie jest / nie są, należy to najpierw naprawić. Oracle doskonale radzi sobie z czasem oszczędzania w ciągu dnia, jeśli parametry są na pierwszym miejscu ustawione poprawnie. (A jeśli tak nie jest, nie jest jasne, dlaczego miałbyś starać się, aby operacja była „bardziej poprawna” niż ta, którą obsługuje baza danych.)
Przykład:w poniższej klauzuli WITH symuluję tabelę z kolumną dt
w typie danych date
. Następnie konwertuję to na timestamp with time zone
, w strefie czasowej (klienta) mojej sesji.
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