sql >> Databáze >  >> RDS >> Oracle

Jak získat časové pásmo operačního systému z databáze Oracle ve formátu řetězce? (Převést/převést datum na ts s tz)

Pokud jsou data již v tabulce Oracle SQL a musíte převést na časové razítko s časovým pásmem (například v novém sloupci, který jste vytvořili ve stejné tabulce), nemusíte jít explicitně do operačního systému nebo do používat Javu nebo jakoukoli jinou věc než samotnou databázi Oracle.

Z vaší otázky není jasné, zda musíte předpokládat, že „datum“ mělo být v časovém pásmu serveru (zmiňujete „databázi“, což obvykle znamená server) nebo časové pásmo klienta (zmíníte „relaci“, což znamená klient). Buď jak buď:

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

nebo použijte sessiontimezone jako druhý argument, pokud to potřebujete.

To předpokládá, že časové pásmo databáze (a/nebo relace) je správně nastaveno v db, respektive v klientovi. Pokud tomu tak není / nejsou, je třeba to nejprve opravit. Oracle je dokonale schopen zvládnout denní úsporný čas, pokud jsou parametry v první řadě správně nastaveny. (A pokud nejsou, není jasné, proč byste se snažili, aby vaše operace byla „přesnější“, než databáze podporuje.)

Příklad:v klauzuli WITH níže simuluji tabulku se sloupcem dt v datovém typu date . Pak to převedu na timestamp with time zone , v časovém pásmu mé relace (klienta).

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


  1. Vypočítejte hodnotu percentilu pomocí MySQL

  2. Důvody pro upgrade na SQL Server 2017

  3. Pomocí datového typu sql date a EF4

  4. Mysql Regex nahradí 0 z ipv4