Pregunta

Tengo lo siguiente en mi cláusula SQL Where. Esto se ejecuta contra una base de datos Oracle. los sc_dt El campo se define en el DB como un campo de fecha.

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

produce el siguiente error "date format picture ends before converting entire input string"

Cuando trato de dar cuenta de los segundos fraccionarios (.0 En este caso) con lo siguiente, recibo el siguiente error.

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

produce el siguiente error "date format not recognized"

Realmente estoy asumiendo que necesito el .FF para dar cuenta del .0 en la cadena "desde". También he probado .FF1, .FF2, ..., .FF9 con los mismos resultados (estoy agarrando pajitas en este momento).

Por lo que puedo ver, el sc_dt Field siempre tiene la porción de mes/día/año poblada (y no la hora/minuto/segunda porción).

Estoy depurando un programa Java que está ejecutando el SQL anterior como una declaración preparada con el 2011-11-03 00:00:00.0 valor.

¿Cómo puedo evitar esto?

¿Fue útil?

Solución

Debe usar la opción de medianoche de segundos. Algo como:

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

O esto:

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

Otros consejos

Un oráculo DATE columna como sc_dt siempre tendrá un componente de día y tiempo hasta el segundo. Dependiendo de su herramienta de consulta y de cómo se configure (generalmente la sesión NLS_DATE_FORMAT), es posible que el componente de tiempo no se muestre de forma predeterminada. Sin embargo, puede ver el componente de tiempo haciendo un explícito TO_CHAR

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

Porque un DATE Solo almacena el tiempo hasta el segundo, sin embargo, no puede usar segundos fraccionales en su máscara de formato. Por lo tanto, tendrá que hacer algo como esto para extraer solo la parte de la cadena hasta los segundos fraccionales. Si no está garantizado que la cadena siempre será de 19 caracteres antes del punto decimal, podría usar INSTR también para buscar el punto decimal y tomar todo antes de eso.

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

Sin embargo, dado que esto proviene de una aplicación Java, está mucho mejor utilizando el tipo de datos correcto. Si vincula una fecha de Java (java.sql.date) usando el setDate Método En la declaración preparada en lugar de vincular una cadena, entonces no tendrá que lidiar con el formato de cadena en su declaración SQL.

Me doy cuenta de que este hilo tiene más de un año, pero ... otra opción solo para tirarlo podría ser:

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

NOTA: ¿Hay un extra '?' arrojado para ilustrar que incluso puedes pegar en unos pocos extra 's. No hay queja de Oracle si los dígitos representados por los '?' S no tienen ningún carácter correspondiente en la cadena de tiempo de origen. Esto puede ser útil si no está seguro de la precisión de los segundos que está recibiendo.

Esta opción brinda cierta flexibilidad al formato de "segundos fraccionales" de su tiempo de origen. No sé si esto realmente está documentado en cualquier lugar.

Hice esto :

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


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

Y funcionó para mí

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

Supongo que el anterior debería funcionar si solo necesita una salida de fecha.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top