sql >> Databasteknik >  >> RDS >> Oracle

Oracle Date datatype, transformerad till 'ÅÅÅÅ-MM-DD HH24:MI:SS TMZ' via SQL

Det är lite förvirring i din fråga:

  • ett Date datatype sparar inte tidszonskomponenten. Den här informationen trunkeras och går förlorad för alltid när du infogar en TIMESTAMP WITH TIME ZONE till ett Date .
  • När du vill visa ett datum, antingen på skärmen eller för att skicka det till ett annat system via ett tecken-API (XML, fil...), använder du TO_CHAR fungera. I Oracle, ett Date har inget format :det är en tidpunkt.
  • Ömsesidigt skulle du använda TO_TIMESTAMP_TZ för att konvertera en VARCHAR2 till en TIMESTAMP , men detta konverterar inte ett Date till en TIMESTAMP .
  • Du använder FROM_TZ för att lägga till tidszonsinformationen till en TIMESTAMP (eller ett Date ).
  • I Oracle, CST är en tidszon men CDT är inte. CDT är en sommartidsinformation.
  • För att komplicera saker ytterligare, CST/CDT (-05:00 ) och CST/CST (-06:00 ) kommer att ha olika värden uppenbarligen, men tidszonen CST kommer att ärva sommartidsinformationen beroende på datum som standard.

Så din konvertering kanske inte är så enkel som den ser ut.

Förutsatt att du vill konvertera ett Date d som du vet är giltig i tidszonen CST/CST till motsvarande i tidszonen CST/CDT , skulle du använda:

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

Mitt standardformat för tidsstämpel har använts här. Jag kan ange ett format uttryckligen:

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. SQL Data Discovery and Classification

  2. skillnad mellan NLS_NCHAR_CHARACTERSET och NLS_CHARACTERSET för Oracle

  3. Återställning av SQL Server 2017

  4. God praxis att öppna/stänga anslutningar i en asp.net-applikation?