2015-10-21 1 views
0

у меня есть запрос на select SQL, который содержит следующее:ORA-01861: буквальная не соответствует ошибке форматной строки не всегда проявляется в подобных случаях

to_date('292278994-08-17 08:12:55.807', 'yyyy-mm-dd hh:mi:ss') 

Значения этой даты было сгенерировано с этим кодом Java line:

Date maxDate = new Date(Long.MAX_VALUE); 

Очевидно, что год 292278994 не соответствует «yyyy». Проблема: работает мой запрос вызывает

ORA-01861: буквальный не соответствует формату строки

на основной базе данных, но не на резервной базе данных. Базы данных полностью эквивалентны, резервная копия, конечно же, является копией основной. Оба они - Oracle 11.2. Я думаю, это зависит от некоторой конфигурации, но я ничего не мог найти.

Кто-нибудь знает причину этого? Спасибо!

+1

Вы говорите, что следующее дает ошибку в одной базе данных, но не в другом? SELECT to_date ('292278994-08-17 08: 12: 55.807', 'yyyy-mm-dd hh: mi: ss') FROM DUAL; Если да - каков результат для базы данных, который не дает ошибки? ETA: если нет, выполняете ли вы оператор select в обоих экземплярах таким образом, чтобы сбрасывать ВСЕ результаты? Возможно, вы используете инструмент, который просто набирает 100 записей, и первые 100 записей, найденных в основной БД, не имеют этой проблемы, но первые 100 записей в резервном режиме. – KevinKirkpatrick

+0

На самом деле у меня запрос SELECT немного длиннее. Тот, который не дает никаких ошибок с нулевой записью. –

+0

Ваш ответ был неоднозначным. Вы запустили это в обеих базах данных? SELECT to_date ('292278994-08-17 08:12:55.807 ',' yyyy-mm-dd hh: mi: ss ') FROM DUAL; Можете ли вы подтвердить, что он дает ошибку в одном, но не в другом? – KevinKirkpatrick

ответ

3

Проверьте объяснить планы вашего фактического запроса, как это выглядит, как у вас есть различные планы и один «короткое замыкание» условие; на самом деле он не смотрит на формат даты.

Вот что я имею в виду:

select * 
from dual 
where 1=0 
AND sysdate < to_date('292278994-08-17 08:12:55.807', 'yyyy-mm-dd hh:mi:ss') 

против

select * 
from dual 
where 1=0 
OR sysdate < to_date('292278994-08-17 08:12:55.807', 'yyyy-mm-dd hh:mi:ss') 

Первый запрос выше будет возвращать 0 строк и не сообщит об ошибке (по крайней мере, это не для меня), но вторая делает. Это потому, что база данных может сначала оценить 1 = 0 (ложь), и не нужно вообще проверять второе условие, потому что FALSE AND (TRUE или FALSE) всегда ложно, тогда как с OR, возможно, что второе условие возвращает TRUE и предложение WHERE возвращает ИСТИННЫЙ результат.

Для тех, кто заинтересован, в плане первого запроса, я получаю это:

Predicate Information (identified by operation id): 
--------------------------------------------------- 

    1 - filter(NULL IS NOT NULL AND [email protected]!<TO_DATE('292278994-08-17 
       08:12:55.807','yyyy-mm-dd hh:mi:ss')) 

(Обратите внимание, что это не 1 = 0 больше, а NULL IS NOT NULL)

и в во-вторых, он знает, что 1 = 0 может быть опущен целиком:

Predicate Information (identified by operation id): 
--------------------------------------------------- 

    1 - filter([email protected]!<TO_DATE('292278994-08-17 
       08:12:55.807','yyyy-mm-dd hh:mi:ss')) 
0

Это покажет параметры, которые могут повлиять на даты. попробовать это на обеих базах данных и сравнить

SELECT VALUE 
FROM NLS_DATABASE_PARAMETERS 
WHERE parameter = 'NLS_DATE_FORMAT'; 
+0

Результат: DD-MON-RR на обоих. –

Смежные вопросы