Domanda
Ho quanto segue nella mia SQL dove la clausola. Questo è in esecuzione contro un database Oracle. Il sc_dt
Il campo è definito nel DB come un campo di data.
sc_dt = TO_DATE('2011-11-03 00:00:00.0', 'YYYY-MM-DD')
produce il seguente errore "date format picture ends before converting entire input string"
Quando provo a tenere conto dei secondi frazionari (.0
In questo caso) con quanto segue, ottengo il seguente errore.
sc_dt = TO_DATE('2011-11-03 00:00:00.0', 'YYYY-MM-DD HH24:MI:SS.FF')
produce il seguente errore "date format not recognized"
Sto davvero solo supponendo che io abbia bisogno del .FF
tenere conto del .0
nella stringa "da". Ho anche provato .FF1
, .FF2
, ..., .FF9
Con gli stessi risultati (sto afferrando le cannucce a questo punto).
Per quanto posso vedere, il sc_dt
Field ha sempre popolato la parte del mese/giorno/anno (e non la porzione di ora/minuto/seconda).
Sto debug di un programma Java che sta eseguendo il SQL sopra come una dichiarazione preparata con il 2011-11-03 00:00:00.0
valore.
Come posso aggirare questo?
Soluzione
È necessario utilizzare l'opzione di mezzanotte passati. Qualcosa di simile a:
select TO_DATE('2011-11-03 00:00:01.1', 'YYYY-MM-DD HH24:MI:SS.SSSSS') from dual
O questo:
select TO_TIMESTAMP('2011-11-03 00:00:00.1', 'YYYY-MM-DD HH24:MI:SS.FF') from dual
Altri suggerimenti
Un oracolo DATE
colonna come sc_dt
avrà sempre un giorno e un componente temporale fino al secondo. A seconda del tuo strumento di query e di come è configurato (generalmente la sessione NLS_DATE_FORMAT
), è possibile che il componente temporale non venga visualizzato per impostazione predefinita. Puoi, tuttavia, vedere la componente temporale facendo un esplicito TO_CHAR
SELECT to_char( sc_dt, 'YYYY-MM-DD HH24:MI:SS' )
FROM table_name
Perché a DATE
Memorizza solo il tempo al secondo, tuttavia, non è possibile utilizzare secondi frazionari nella maschera di formato. Quindi dovresti fare qualcosa del genere per estrarre solo la parte della stringa fino ai secondi frazionari. Se non sei garantito che la stringa sarà sempre 19 caratteri prima del punto decimale, potresti usare INSTR
Inoltre, cercare il punto decimale e prendere tutto prima.
TO_DATE( substr('2011-11-03 00:00:00.0', 1, 19), 'YYYY-MM-DD HH24:MI:SS')
Poiché questo proviene da un'applicazione Java, tuttavia, stai molto meglio usando il tipo di dati corretto. Se si lega una data Java (java.sql.date) usando il setDate
Metodo sull'istruzione preparata piuttosto che vincolare una stringa, non dovrai affrontare il formato stringa nell'istruzione SQL.
Mi rendo conto che questo thread ha più di un anno, ma ... un'altra opzione solo per gettarlo potrebbe essere:
src_dt=select TO_DATE('2011-11-03 00:00:01.1234', 'YYYY-MM-DD HH24:MI:SS.?????') from dual;
Nota: c'è un extra '?' gettato per illustrare che puoi persino rimanere in qualche extra '?' S. Non vi è alcuna lamentela da parte di Oracle se le cifre rappresentate dalle '?' Non hanno alcun carattere corrispondente nella stringa di tempo di origine. Questo potrebbe essere utile se non sei sicuro della precisione dei secondi che stai ricevendo.
Questa opzione offre una certa flessibilità al formato di "secondi frazionari" dal tempo di origine. Non so che questo sia effettivamente documentato da nessuna parte.
L'ho fatto :
ALTER SESSION
SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS.?';
--Change the decimal
ALTER SESSION
SET NLS_NUMERIC_CHARACTERS = ',.';
E ha funzionato per me
src_dt =select TO_DATE('2011-11-03 00:00:01.1', 'YYYY-MM-DD HH24:MI:SS.SSSSS') from dual
Immagino che quello sopra dovrebbe funzionare se hai solo bisogno di un output della data.