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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top