Вы можете повторить преобразование в пределах ветви or
, которая, очевидно, немного запутана:
select * from dual
where to_date(' ','YYYYMMDD') = '19960512'
or (1 = 1 and to_date(' ','YYYYMMDD') != '19960512');
Error report -
ORA-01841: (full) year must be between -4713 and +9999, and not be 0
Или, если единственный сценарий с недействительной датой, о котором вам нужно беспокоиться, это пробелы, вы можете сделатьчто-то еще, чтобы эта ветвь оценивалась как ложная в этом случае:
select * from dual
where to_date(' ','YYYYMMDD') = '19960512'
or (1 = 1 and trim(' ') is not null);
строка из базы данных извлекается и передается в TO_DATE в запросе
подразумевает, что выхранение дат в виде строк в вашей базе данных, , что не очень хорошая идея ;поэтому, если у вас есть пробелы, у вас может быть что угодно, и вам придется иметь дело и с другими потенциальными ошибками, которые не подхватит подход is not null
.
И ни один из этих запросов не выдаст ошибку спередана пустая строка (т. е. null), но тогда и ваши первые два исходных запроса не будут;все они просто не найдут данных.
Конечно, '19960512'
не дата, поэтому вы делаете здесь дополнительные неявные преобразования;было бы безопаснее пропустить это через to_date()
или использовать литерал даты, если это действительно фиксированное значение:
where to_date(' ','YYYYMMDD') = date '1996-05-12'