Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wie erhalte ich die Zeitzone des Betriebssystems aus der Oracle-Datenbank im Zeichenfolgenformat? (Datum mit tz nach ts migrieren/konvertieren)

Wenn sich die Daten bereits in einer Oracle SQL-Tabelle befinden und Sie in einen Zeitstempel mit Zeitzone konvertieren müssen (z. B. in einer neuen Spalte, die Sie in derselben Tabelle erstellt haben), müssen Sie nicht explizit zum Betriebssystem oder zu wechseln Verwenden Sie Java oder etwas anderes als die Oracle-Datenbank selbst.

Aus Ihrer Frage geht nicht hervor, ob Sie davon ausgehen müssen, dass das "Datum" in der Serverzeitzone liegen sollte (Sie erwähnen "die Datenbank", was normalerweise den Server bedeutet) oder in der Clientzeitzone (Sie erwähnen "Sitzung", was bedeutet der Kunde). So oder so:

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

oder verwenden Sie sessiontimezone als zweites Argument, wenn Sie das brauchen.

Dies setzt voraus, dass die Zeitzone der Datenbank (und/oder der Sitzung) in der db bzw. im Client richtig eingerichtet ist. Wenn es nicht ist / sie nicht sind, muss das zuerst behoben werden. Oracle ist durchaus in der Lage, mit der Tageszeit umzugehen, wenn die Parameter von vornherein richtig eingestellt sind. (Und wenn sie es nicht sind, ist es nicht klar, warum Sie versuchen sollten, Ihre Operation "korrekter" zu machen, als die Datenbank überhaupt unterstützt.)

Beispiel:In der folgenden WITH-Klausel simuliere ich eine Tabelle mit einer Spalte dt im Datentyp date . Dann konvertiere ich das in einen timestamp with time zone , in der Zeitzone meiner Sitzung (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