Oracle
 sql >> Base de données >  >> RDS >> Oracle

Type de données Oracle Date, transformé en 'YYYY-MM-DD HH24:MI:SS TMZ' via SQL

Il y a un peu de confusion dans votre question :

  • une Date Le type de données n'enregistre pas le composant de fuseau horaire. Cette information est tronquée et perdue à jamais lorsque vous insérez un TIMESTAMP WITH TIME ZONE en une Date .
  • Lorsque vous souhaitez afficher une date, soit à l'écran, soit pour l'envoyer vers un autre système via une API caractère (XML, fichier...), vous utilisez le TO_CHAR une fonction. Dans Oracle, une Date n'a pas de format  :il s'agit d'un point dans le temps.
  • Réciproquement, vous utiliseriez TO_TIMESTAMP_TZ pour convertir un VARCHAR2 à un TIMESTAMP , mais cela ne convertira pas une Date à un TIMESTAMP .
  • Vous utilisez FROM_TZ pour ajouter les informations de fuseau horaire à un TIMESTAMP (ou une Date ).
  • Dans Oracle, CST est un fuseau horaire mais CDT n'est pas. CDT est une information sur l'heure d'été.
  • Pour compliquer davantage les choses, CST/CDT (-05:00 ) et CST/CST (-06:00 ) aura évidemment des valeurs différentes, mais le fuseau horaire CST héritera des informations d'heure d'été en fonction de la date par défaut.

Votre conversion n'est donc peut-être pas aussi simple qu'elle en a l'air.

En supposant que vous souhaitiez convertir une Date d dont vous savez qu'elle est valide au fuseau horaire CST/CST à l'équivalent au fuseau horaire CST/CDT , vous utiliseriez :

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

Mon format d'horodatage par défaut a été utilisé ici. Je peux spécifier un format explicitement :

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