2017-06-08 2 views
2

oracle exemple timestamp: 26-APR-17 09.40.13.243356000Conversion d'un horodatage oracle en horodatage postgres?

Salut j'ai un scénario que je suis en train de convertir l'horodatage oracle à l'horodatage postgres mais la sortie ne devrait.

requête exécutée dans psql

migration=# SELECT TO_TIMESTAMP('26-APR-17 09.40.13.243356000','DD-MON-YY HH24.MI.SS:MS') :: timestamp without time zone; 
        to_timestamp 
---------------------------- 
    2017-04-26 09:15:55.864128     ----- this is output 
(1 row)  

La sortie doit être: 2017-04-26 09:40:13.243356

enter image description here

+0

Aucune base de données va ajouter arbitrairement une demi-heure. Cela ressemble à un problème de fuseau horaire, si l'une des deux bases de données utilise le fuseau horaire indien. Vous n'avez pas publié le code * réel *. Les valeurs que vous avez affichées ressemblent au * résultat localisé * de certaines requêtes, et non aux valeurs réelles. Très peu de pays utilisent de tels délimiteurs. Seul l'Inde utilise un décalage d'une demi-heure (que je sache) –

+1

Pour éviter les problèmes de localisation, utilisez le format ISO8601, c'est-à-dire «AAAA-MM-DDTHH: MM: SS.ffffZ» ou «AAAA-MM-DDTHH: mm: ss. ffff + HH: mm' –

+0

@PanagiotisKanavos regarde la photo. J'ai édité la question. –

Répondre

3

Le problème est que 243356000 est pris en millisecondes, ce qui explique le décalage étrange d'environ une demi-heure.

Couper les trois dernières sigits et utiliser US pour microsecondes:

SELECT to_timestamp(
      regexp_replace(
      '26-APR-17 09.40.13.243356000', 
      '\d{3}$', 
      '' 
     ), 
      'DD-MON-YY HH24.MI.SS.US' 
     ); 
2

L'erreur est le résultat de la valeur non valide pour le format millisecondes masque MS.

As documented in the manual les valeurs autorisées pour les millisecondes sont 000-999

.243356000 est cependant pas non plus valable pour microsecondes (masque de format US) en raison des zéros de fin.

Si vous souhaitez utiliser ce format, vous devez supprimer les zéros de la chaîne d'entrée, par exemple: en utilisant rtrim()

psql (9.6.3) 
Type "help" for help. 

postgres> SELECT TO_TIMESTAMP(rtrim('26-APR-17 09.40.13.243356000','0'),'DD-MON-YY HH24.MI.SS.US'); 
     to_timestamp 
------------------------------- 
2017-04-26 09:40:13.243356+02 
(1 row) 

postgres> 

Je suis d'accord aussi avec PanagiotisKanavos qu'il serait préférable d'utiliser un format indépendant des paramètres régionaux (c.-à-d. numéros pour le mois et une année à quatre chiffres), de préférence une norme ISO pour les valeurs d'horodatage.

+1

Cela conduira à des résultats erronés si les trois derniers chiffres ne sont pas tous 0. –