TO_DATE в запросе с нулевым годом

Я хочу сделать это в одном запросе, где я проверяю, больше ли моя дата создания, чем другая, но столбцы таблицы были разделены на год, месяц и день, а иногда и недопустимые значения в году.

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.

Могу ли я написать что-нибудь в запросе, чтобы игнорировать недопустимые значения и просто считать допустимые.

@eshirvana ISDATE() недоступен в Oracle. Но можно использовать определяемую пользователем функцию, как это предлагается на странице asktom.oracle.com/pls/apex/….

Dave Costa 18.12.2020 16:51

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

EdStevens 18.12.2020 17:05
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
2
206
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Проблема, вероятно, в однозначных числах для месяца и дня. Это можно исправить, расставив дефисы:

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')

Прикольно, я не знал об этой функции.

Dave Costa 18.12.2020 16:51

Другие вопросы по теме