Формат даты не распознается при возврате результатов
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')