sql >> Database >  >> RDS >> Oracle

Oracle Date datatype, getransformeerd naar 'YYYY-MM-DD HH24:MI:SS TMZ' via SQL

Er is een beetje verwarring in uw vraag:

  • een Date datatype slaat de tijdzonecomponent niet op. Dit stukje informatie wordt afgekapt en gaat voor altijd verloren wanneer u een TIMESTAMP WITH TIME ZONE invoegt in een Date .
  • Als u een datum wilt weergeven, hetzij op het scherm, hetzij via een teken-API (XML, bestand...), naar een ander systeem wilt verzenden, gebruikt u de TO_CHAR functie. In Oracle, een Date heeft geen formaat :het is een tijdstip.
  • Omgekeerd zou je TO_TIMESTAMP_TZ . gebruiken om een ​​VARCHAR2 . te converteren naar een TIMESTAMP , maar dit converteert geen Date naar een TIMESTAMP .
  • U gebruikt FROM_TZ om de tijdzone-informatie toe te voegen aan een TIMESTAMP (of een Date ).
  • In Oracle, CST is een tijdzone maar CDT is niet. CDT is informatie over zomertijd.
  • Om de zaken nog ingewikkelder te maken, CST/CDT (-05:00 ) en CST/CST (-06:00 ) zal uiteraard verschillende waarden hebben, maar de tijdzone CST zal standaard de informatie over de zomertijd erven, afhankelijk van de datum.

Uw conversie is dus misschien niet zo eenvoudig als het lijkt.

Ervan uitgaande dat u een Date . wilt converteren d waarvan u weet dat deze geldig is in tijdzone CST/CST naar het equivalent in tijdzone CST/CDT , zou je gebruiken:

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

Mijn standaard tijdstempelformaat is hier gebruikt. Ik kan expliciet een formaat specificeren:

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


  1. Hoe de kolomkoppen te verwijderen bij het e-mailen van queryresultaten in SQL Server (T-SQL)

  2. Inleiding tot OPENJSON met voorbeelden (SQL Server)

  3. Ontdek vrije ruimte op tablespace

  4. Gegevensprofilering:gegevensdetails ontdekken