Question

J'ai ce qui suit dans ma clause SQL Where.Ceci s'exécute sur une base de données Oracle.Le sc_dt le champ est défini dans la base de données comme un champ de date.

sc_dt = TO_DATE('2011-11-03 00:00:00.0', 'YYYY-MM-DD')

produit l'erreur suivante "date format picture ends before converting entire input string"

Quand j'essaie de prendre en compte les fractions de secondes (.0 dans ce cas) avec ce qui suit, j'obtiens l'erreur suivante.

sc_dt = TO_DATE('2011-11-03 00:00:00.0', 'YYYY-MM-DD HH24:MI:SS.FF')

produit l'erreur suivante "date format not recognized"

Je suppose simplement que j'ai besoin du .FF pour rendre compte de .0 dans la chaîne "de".j'ai aussi essayé .FF1, .FF2, ..., .FF9 avec les mêmes résultats (je m'accroche à des pailles à ce stade).

D'après ce que je peux voir, le sc_dt Le champ contient toujours la partie mois/jour/année (et non la partie heure/minute/seconde).

Je débogue un programme Java qui exécute le SQL ci-dessus en tant qu'instruction préparée avec le 2011-11-03 00:00:00.0 valeur.

Comment puis-je contourner ce problème ?

Était-ce utile?

La solution

Vous devez utiliser l’option secondes après minuit.Quelque chose comme:

select TO_DATE('2011-11-03 00:00:01.1', 'YYYY-MM-DD HH24:MI:SS.SSSSS') from dual

Ou ca:

select TO_TIMESTAMP('2011-11-03 00:00:00.1', 'YYYY-MM-DD HH24:MI:SS.FF') from dual

Autres conseils

Un oracle DATE colonne comme sc_dt aura toujours un jour et une heure à la seconde près.En fonction de votre outil de requête et de sa configuration (généralement le paramètre de la session NLS_DATE_FORMAT), il est possible que la composante temporelle ne soit pas affichée par défaut.Vous pouvez cependant voir la composante temporelle en effectuant une opération explicite TO_CHAR

SELECT to_char( sc_dt, 'YYYY-MM-DD HH24:MI:SS' ) 
  FROM table_name

Parce qu'un DATE stocke uniquement l'heure à la seconde près, cependant, vous ne pouvez pas utiliser de fractions de seconde dans votre masque de format.Vous devrez donc faire quelque chose comme ceci pour extraire uniquement la partie de la chaîne jusqu'aux fractions de seconde.Si vous n'êtes pas assuré que la chaîne contiendra toujours 19 caractères avant la virgule décimale, vous pouvez utiliser INSTR aussi bien chercher le point décimal et prendre tout ce qui précède.

TO_DATE( substr('2011-11-03 00:00:00.0', 1, 19), 'YYYY-MM-DD HH24:MI:SS')

Cependant, comme cela provient d'une application Java, il est préférable d'utiliser le type de données correct.Si vous liez une date Java (java.sql.Date) à l'aide du setDate méthode sur l'instruction préparée plutôt que de lier une chaîne, vous n'aurez alors pas à gérer le format de chaîne dans votre instruction SQL.

Je me rends compte que ce fil date de plus d'un an mais...Une autre option pour l'ajouter pourrait être :

src_dt=select TO_DATE('2011-11-03 00:00:01.1234', 'YYYY-MM-DD HH24:MI:SS.?????') from dual;

Note:il y a un '?' supplémentaire pour illustrer que vous pouvez même coller quelques '?' en plus.Il n'y a aucune plainte de la part d'Oracle si les chiffres représentés par les « ? » n'ont AUCUN caractère correspondant dans la chaîne d'heure source.Cela peut être utile si vous n'êtes pas sûr de la précision des secondes que vous recevez.

Cette option donne une certaine flexibilité au format des « fractions de secondes » à partir de votre heure source.Je ne sais pas si cela est réellement documenté nulle part.

J'ai fait ça :

ALTER SESSION 
SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS.?';


--Change the decimal
ALTER SESSION 
SET NLS_NUMERIC_CHARACTERS = ',.';

Et ça a fonctionné pour moi

src_dt=select TO_DATE('2011-11-03 00:00:01.1', 'YYYY-MM-DD HH24:MI:SS.SSSSS') from dual

Je suppose que celui ci-dessus devrait fonctionner si vous avez juste besoin d'une sortie de date.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top