Сравнение даты в Oracle нарушено из-за летнего времени
Мы отлаживали проблему с 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) все еще не работает.