Мы отлаживаем проблему с SQL-запросом, выполняемым с сервера приложений, на котором выполняется Java через Hibernate. Ошибка:
[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
Мы смогли сузить это до простого SQL ниже.
select *
from MY_TABLE T
where T.MY_TIMESTAMP >= (CURRENT_TIMESTAMP - interval '1' hour );
Когда мы запускаем его в той же базе данных, получаем ошибку:
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.
Столбец MY_TIMESTAMP
определяется как TIMESTAMP(6)
.
FWIW, если мы изменим сравнение в SQL выше от >=
до <=
, запрос будет выполнен.
Мы предполагаем, что это имеет какое-то отношение к изменению времени (мы в Америке /New _York), но у нас возникают проблемы с попыткой выяснить, куда идти отсюда с нашей отладкой.
Кроме того, мы видели эту проблему с похожим запросом, который работает через MyBatis, и ошибка выглядит так:
### 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
ОБНОВЛЕНИЕ: товарищ по команде в Windows изменил свои настройки даты и времени Windows, сняв флажок "Автоматически настраивать часы для летнего времени", а затем открыл новый экземпляр SQLDeveloper. Второй экземпляр может запускать запрос без каких-либо проблем, но первый (со старой установкой DST) все еще не работает.