Comparación de fecha de Oracle rota debido a horario de verano
Hemos estado depurando un problema con una consulta SQL ejecutada desde un servidor de aplicaciones que ejecuta Java a través de Hibernate. El error:
[3/10/14 10:52:07:143 EDT] 0000a984 JDBCException W org.hibernate.util.JDBCExceptionReporter logExceptions SQL Error: 1878, SQLState: 22008
[3/10/14 10:52:07:144 EDT] 0000a984 JDBCException E org.hibernate.util.JDBCExceptionReporter logExceptions ORA-01878: specified field not found in datetime or interval
Hemos podido reducir esto al simple SQL a continuación.
select *
from MY_TABLE T
where T.MY_TIMESTAMP >= (CURRENT_TIMESTAMP - interval '1' hour );
Cuando ejecutamos esto en la misma base de datos, obtenemos el error:
ORA-01878: specified field not found in datetime or interval
01878. 00000 - "specified field not found in datetime or interval"
*Cause: The specified field was not found in the datetime or interval.
*Action: Make sure that the specified field is in the datetime or interval.
losMY_TIMESTAMP
la columna se define comoTIMESTAMP(6)
.
FWIW, si cambiamos la comparación en el SQL anterior de>=
a<=
, la consulta funciona.
Asumimos que esto tiene algo que ver con el cambio de hora (estamos en Estados Unidos / Nueva York), pero estamos teniendo problemas para tratar de averiguar a dónde ir desde aquí con nuestra depuración.
Además, hemos visto este problema con una consulta similar que se ejecuta a través de MyBatis y el error se ve así:
### Error querying database. Cause: java.sql.SQLException: ORA-01878: specified field not found in datetime or interval
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### Cause: java.sql.SQLException: ORA-01878: specified field not found in datetime or interval
ACTUALIZACIÓN: Un compañero de equipo en Windows cambió su configuración de fecha y hora de Windows desmarcando "Ajustar automáticamente el reloj para el horario de verano" y luego abrió una nueva instancia de SQLDeveloper. La segunda instancia puede ejecutar la consulta sin ningún problema, pero la primera (con la configuración anterior de DST) aún falla.