Формат даты не распознается при возврате результатов

select * from table where trunc(value1)=to_date('25-AUG-15','DD-MON-YY');

Это отлично

select * from table where trunc(value1)=to_date('25-AUG-15','DD-Mon-YY');

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

Даже это работает,

select * from table where trunc(value1)=to_date('25/AUG/15','DD-MON-YY');

результат возвращается

И это,

 select * from table where trunc(value1) = to_date('25-AUG-15', 'DD-MM-YY');

результат возвращается

но это работает очень хорошо

 select * from table where trunc(value1) = to_date('25-AUG-15','MMDDYY');

он проверяет месяц, который не найден, и возвращает ошибку (хорошо проанализировано!!!)

Почему этот спецификатор формата не выполняет строгую проверку предоставленного значения даты?

Благодарю.

1 ответ

Решение

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

TO_DATE('17!!!SEP£££15', 'DD$$$MON***YY')

идентичен:

TO_DATE('170915', 'DDMONYY')

Если количество и положение подстановочных знаков в вводе не совпадают с маской формата, вы получите исключение, относящееся к следующему токену, который он ищет:

TO_DATE('17!!!!SEP-15', 'DD-MON-YY')

ORA-01843: not a valid month

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

TO_DATE('17-SEP-15','DD----------------MON-YY')

такой же как:

TO_DATE('17-SEP-15','DD-MON-YY')

и поскольку подстановочные знаки в маске формата являются опцией, также имеет тот же эффект, что и:

 TO_DATE('17-SEP-15','DD-MON-YY')
Другие вопросы по тегам