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

Oracle Date-Datentyp, umgewandelt in „YYYY-MM-DD HH24:MI:SS TMZ“ durch SQL

Ihre Frage ist etwas verwirrend:

  • ein Date datatype speichert die Zeitzonenkomponente nicht. Diese Information wird abgeschnitten und geht für immer verloren, wenn Sie einen TIMESTAMP WITH TIME ZONE einfügen in ein Date .
  • Wenn Sie ein Datum anzeigen möchten, entweder auf dem Bildschirm oder um es über eine Zeichen-API (XML, Datei...) an ein anderes System zu senden, verwenden Sie den TO_CHAR Funktion. In Oracle ein Date hat kein Format :es ist ein Zeitpunkt.
  • Umgekehrt würden Sie TO_TIMESTAMP_TZ verwenden zum Konvertieren eines VARCHAR2 zu einem TIMESTAMP , aber das konvertiert kein Date zu einem TIMESTAMP .
  • Sie verwenden FROM_TZ um die Zeitzoneninformationen zu einem TIMESTAMP hinzuzufügen (oder ein Date ).
  • In Oracle, CST ist eine Zeitzone, aber CDT ist nicht. CDT ist eine Sommerzeitinformation.
  • Um die Sache noch komplizierter zu machen, CST/CDT (-05:00 ) und CST/CST (-06:00 ) wird offensichtlich andere Werte haben, aber die Zeitzone CST erbt standardmäßig die Sommerzeitinformationen abhängig vom Datum.

Ihre Konvertierung ist also möglicherweise nicht so einfach, wie sie aussieht.

Angenommen, Sie möchten ein Date konvertieren d von der Sie wissen, dass sie in der Zeitzone CST/CST gültig ist zum Äquivalent in der Zeitzone CST/CDT , würden Sie verwenden:

SQL> SELECT from_tz(d, '-06:00') initial_ts,
  2         from_tz(d, '-06:00') at time zone ('-05:00') converted_ts
  3    FROM (SELECT cast(to_date('2012-10-09 01:10:21',
  4                              'yyyy-mm-dd hh24:mi:ss') as timestamp) d
  5            FROM dual);

INITIAL_TS                      CONVERTED_TS
------------------------------- -------------------------------
09/10/12 01:10:21,000000 -06:00 09/10/12 02:10:21,000000 -05:00

Hier wurde mein Standard-Zeitstempelformat verwendet. Ich kann ein Format explizit angeben:

SQL> SELECT to_char(from_tz(d, '-06:00'),'yyyy-mm-dd hh24:mi:ss TZR') initial_ts,
  2         to_char(from_tz(d, '-06:00') at time zone ('-05:00'),
  3                 'yyyy-mm-dd hh24:mi:ss TZR') converted_ts
  4    FROM (SELECT cast(to_date('2012-10-09 01:10:21',
  5                              'yyyy-mm-dd hh24:mi:ss') as timestamp) d
  6            FROM dual);

INITIAL_TS                      CONVERTED_TS
------------------------------- -------------------------------
2012-10-09 01:10:21 -06:00      2012-10-09 02:10:21 -05:00