Я хочу сделать это в одном запросе, где я проверяю, больше ли моя дата создания, чем другая, но столбцы таблицы были разделены на год, месяц и день, а иногда и недопустимые значения в году.
Select count{*) from coverage cv
WHERE EXIST (Select * from addressTable ad
and cv.date > to_date(ad.year||ad.month||ad.day, 'YYYYMMDD')
Когда я запускаю это, я получаю сообщение об ошибке ORA-01841: Полный год должен быть между -4713 и +9999, а не 0.
Могу ли я написать что-нибудь в запросе, чтобы игнорировать недопустимые значения и просто считать допустимые.
И еще один пример того, почему так важно использовать правильные типы данных. Тот факт, что год, месяц и день представляют собой отдельные столбцы вместо одного столбца DATE, сам по себе является очень серьезным недостатком дизайна.
Проблема, вероятно, в однозначных числах для месяца и дня. Это можно исправить, расставив дефисы:
to_date(ad.year || '-' || ad.month || '-' ad.day, 'YYYY-MM-DD')
Могу ли я написать что-нибудь в запросе, чтобы игнорировать недопустимые значения и просто считать допустимые?
Если вы используете Oracle 12.2 или выше, вы можете использовать on conversion error:
to_date(ad.year || ad.month || ad.day default null on conversion error, 'yyyymmdd')
Прикольно, я не знал об этой функции.
@eshirvana ISDATE() недоступен в Oracle. Но можно использовать определяемую пользователем функцию, как это предлагается на странице asktom.oracle.com/pls/apex/….