sql >> Database teknologi >  >> RDS >> Oracle

Oracle Date datatype, transformeret til 'ÅÅÅÅ-MM-DD HH24:MI:SS TMZ' gennem SQL

Der er lidt forvirring i dit spørgsmål:

  • en Date datatype gemmer ikke tidszonekomponenten. Dette stykke information afkortes og går tabt for altid, når du indsætter et TIMESTAMP WITH TIME ZONE til en Date .
  • Når du vil vise en dato, enten på skærmen eller for at sende den til et andet system via et tegn-API (XML, fil...), bruger du TO_CHAR fungere. I Oracle, en Date har intet format :det er et tidspunkt.
  • Gensidigt ville du bruge TO_TIMESTAMP_TZ at konvertere en VARCHAR2 til en TIMESTAMP , men dette konverterer ikke en Date til en TIMESTAMP .
  • Du bruger FROM_TZ for at tilføje tidszoneoplysningerne til en TIMESTAMP (eller en Date ).
  • I Oracle, CST er en tidszone, men CDT er ikke. CDT er en sommertid information.
  • For at komplicere tingene yderligere, CST/CDT (-05:00 ) og CST/CST (-06:00 ) vil naturligvis have forskellige værdier, men tidszonen CST vil som standard arve sommertid-informationen afhængigt af datoen.

Så din konvertering er muligvis ikke så enkel, som den ser ud.

Forudsat at du vil konvertere en Date d som du ved er gyldig i tidszonen CST/CST til det tilsvarende i tidszonen CST/CDT , ville du bruge:

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

Mit standard tidsstempelformat er blevet brugt her. Jeg kan udtrykkeligt angive et format:

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. Er der en måde at hente visningsdefinitionen fra en SQL Server ved hjælp af almindelig ADO?

  2. Hvordan gendanner man en enkelt tabel fra en .sql postgresql backup?

  3. Hvordan får jeg kolonnedatatype i Oracle med PL-SQL med lave privilegier?

  4. #1071 - Den angivne nøgle var for lang; max nøglelængde er 1000 bytes