Comparação da data do Oracle quebrada por causa do horário de verão
Estamos depurando um problema com uma consulta SQL executada em um servidor de aplicativos executando Java via Hibernate. O erro:
[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
Conseguimos restringir isso ao SQL simples abaixo.
select *
from MY_TABLE T
where T.MY_TIMESTAMP >= (CURRENT_TIMESTAMP - interval '1' hour );
Quando executamos isso no mesmo banco de dados, obtemos o erro:
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.
oMY_TIMESTAMP
coluna é definida comoTIMESTAMP(6)
.
FWIW, se alterarmos a comparação no SQL acima de>=
para<=
, a consulta funciona.
Assumimos que isso tenha algo a ver com a mudança de horário (estamos na América / Nova_Iorque), mas estamos tendo problemas para tentar descobrir para onde ir com nossa depuração.
Além disso, vimos esse problema com uma consulta semelhante que está sendo executada no MyBatis e o erro se parece com:
### 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
ATUALIZAÇÃO: Uma colega de equipe no Windows alterou as configurações de data e hora do Windows desmarcando "Ajustar automaticamente o relógio para o horário de verão" e, em seguida, abriu uma nova instância do SQLDeveloper. A segunda instância é capaz de executar a consulta sem nenhum problema, mas a primeira (com a configuração antiga do horário de verão) ainda falha.