2017-09-29 55 views
0

je requête suivante:Impossible de convertir la date et varchar à ce jour dans une base Oracle

SELECT TO_DATE(date || ' ' || time, 'DD-MON-YY HH24:MI:SS') FROM table; 

date est DATE

time est VARCHAR2(4000 CHAR)

Après l'exécution de la requête que je reçois 27-OCT-16 sans temps au lieu de 27-OCT-16 14:26:09.

Y a-t-il une solution?

+0

et quelle est la valeur de 'time'? – Ravi

+0

l'heure est '14: 26: 09' – AStefanovskiy

+2

Je ne suis pas tout à fait sûr de ce que le problème est mais j'essaierais ce qui suit:' SELECT TO_DATE (TO_CHAR (date, 'DD-MON-YY') || '' || time, 'DD-MON-YY HH24: MI: SS') FROM table; ' –

Répondre

4

[TL; DR] Votre date a une composante de temps, mais vous comptez sur les conversions de chaînes implicites et le modèle de format par défaut (probablement DD-MON-YY) n'affiche pas le composant de temps.


Votre requête:

SELECT TO_DATE(date || ' ' || time, 'DD-MON-YY HH24:MI:SS') 
FROM table; 

Le DATE ne dispose pas d'un format; il est stocké en interne sous la forme 7-bytes et c'est le programme client que vous utilisez pour accéder à la base de données qui appliquera son propre formatage à la date (que vous pouvez généralement définir via les préférences de ce programme).

Pour le développeur SQL/Plus et SQL, il s'agit généralement du paramètre de session NLS_DATE_FORMAT. Que vous pouvez trouver le format d'utiliser la requête:

SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT' 

Essayer de concaténer une DATE avec une chaîne convertira implicitement la date à une chaîne et la requête est équivalente à:

SELECT TO_DATE(
     TO_CHAR(
      date, 
      (SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT') 
     ) 
     || time, 
     'DD-MON-YY HH24:MI:SS' 
     ) 
FROM table 

Et puis la deuxième conversion implicite à quelque chose que le programme client peut afficher votre requête fera l'équivalent de:

SELECT TO_CHAR(
     TO_DATE(
      TO_CHAR(
      date, 
      (SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT') 
      ) 
      || time, 
      'DD-MON-YY HH24:MI:SS' 
     ), 
     (SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT') 
     ) 
FROM table 

Je suppose que votre NLS_DATE_FORMAT est DD-MON-YY (ou DD-MON-YYYY) - sinon la conversion initiale échouerait et ceci n'a pas de composante de temps donc la conversion de l'UI d'une date de retour à une chaîne n'inclut pas non plus de composant temps.

Si vous voulez le DATE avec un format spécifique, utilisez simplement TO_CHAR pour le montrer.

SELECT TO_CHAR(
     TO_DATE(
      TO_CHAR(date, 'DD-MON-YYYY') || ' ' || time, 
      'DD-MON-YYYY HH24:MI:SS' 
     ), 
     'DD-MON-YYYY HH24:MI:SS' 
     ) 
FROM table; 

Ou vous pourriez alter the session variable (mais cela risque de briser la conversion de votre chaîne implicite initiale) donc, ne pas le faire, il suffit de changer toutes vos conversions de chaînes implicites à ceux explicites et spécifier le modèle de format que vous utilisez .