Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment collecter le fuseau horaire du système d'exploitation à partir de la base de données Oracle au format chaîne ? (Migrer/convertir la date en ts avec tz)

Si les données sont déjà dans une table Oracle SQL et que vous devez les convertir en un horodatage avec fuseau horaire (par exemple, dans une nouvelle colonne que vous avez créée dans la même table), vous n'avez pas besoin d'accéder explicitement au système d'exploitation ou de utiliser Java ou toute autre chose, autre que la base de données Oracle elle-même.

Il n'est pas clair d'après votre question si vous devez supposer que la "date" était censée être dans le fuseau horaire du serveur (vous mentionnez "la base de données" qui signifie normalement le serveur) ou le fuseau horaire du client (vous mentionnez "session" qui signifie le client). Dans tous les cas :

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

ou utilisez sessiontimezone comme deuxième argument, si c'est ce dont vous avez besoin.

Cela suppose que le fuseau horaire de la base de données (et/ou de la session) est correctement configuré dans la base de données, respectivement dans le client. Si ce n'est pas le cas / ils ne le sont pas, cela doit d'abord être corrigé. Oracle est parfaitement capable de gérer l'heure d'épargne journalière, si les paramètres sont définis correctement en premier lieu. (Et si ce n'est pas le cas, la raison pour laquelle vous essaieriez de rendre votre opération "plus correcte" que ce que la base de données prend en charge n'est pas claire.)

Exemple :dans la clause WITH ci-dessous, je simule une table avec une colonne dt dans le type de données date . Ensuite, je convertis cela en un timestamp with time zone , dans le fuseau horaire de ma session (client).

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