Запрос записи по дате (01 мая 1916 г.) в Oracle с использованием Java / EJB 2.x

У меня есть объект EJB 2.1, который запрашивает столбец «дата рождения» в таблице Oracle. Столбец в базе данных имеет тип DATE. Запрос работает без проблем, за исключением одной конкретной даты: 01 мая 1916 года.

Это как-то связано с переходом на летнее время. Oracle хранит дату как: 01.05.1916, 1:00:00 AM, а время всех других дат - 12:00:00 (например, 1/7/1971 12:00:00 AM).

В системах производства / приемки запрос (с EJB-QL!) За 01 мая 1916 г. не дал результатов. Странно то, что он работает на моей системе разработки / тестирования. Я проверил настройки базы данных в различных системах и обнаружил, что параметр DBTIMEZONE был установлен на +00: 00 в полях dev / test и на +02: 00 в полях производства / принятия. Однако изменение часового пояса на +02: 00 не дает никакой разницы.

Что может вызвать такое поведение? Как искать эту дату рождения?

6.11.2009 10:23:10
1 ОТВЕТ

Просто дикая догадка: вы находитесь в Бельгии, и дата была неправильно записана в базу данных, так что изменение настроек часового пояса позже не будет иметь никакого значения при запросах?

В Бельгии и некоторых других европейских странах DST был введен 1 мая 1916 года, пропустив период с 12:00 до 01:00, поэтому 1 мая, 12:00 утра фактически не существовало. Если база данных заполнена программным обеспечением Java, я бы предположил, что программа Java уже записала 1AM в базу данных. Что произойдет, если вы пропустите компонент Java и будете использовать SQL-клиент для вставки и запроса значения «без времени» в / из столбца, например, to_date ('1916-05-01', 'YYYY-MM-DD')?

1
6.11.2009 11:07:18
Запросы напрямую с клиентом SQL работают как шарм. Поскольку to_date ('1916-05-01', 'YYYY-MM-DD') игнорирует компонент времени. Однако не ясно, как сделать это из Java с EJB 2.x QL.
Richard Kettelerij 2.12.2009 11:16:55