#oracle #constraints
Вопрос:
Можно ли использовать ограничение ПРОВЕРКИ, чтобы предотвратить любую дату, которая выпадает на воскресенье? Я не хочу использовать спусковой крючок.
Ответ №1:
Да, контрольное ограничение может проверить, что день недели не является воскресеньем. Вот пример:
create table date_test (entry_date date);
alter table date_test add constraint day_is_not_sunday
check ( to_char(entry_date,'DAY','NLS_DATE_LANGUAGE = ENGLISH') not like 'SUNDAY%');
—Справа от ВОСКРЕСЕНЬЯ есть пустые места, поэтому для соответствия строке требуется like или rtrim.
insert into date_test values(to_date('2008-10-12','YYYY-MM-DD')); --Sunday
insert into date_test values(to_date('2008-10-11','YYYY-MM-DD'));
insert into date_test values(to_date('2008-10-10','YYYY-MM-DD'));
insert into date_test values(to_date('2008-10-09','YYYY-MM-DD'));
insert into date_test values(to_date('2008-10-08','YYYY-MM-DD'));
insert into date_test values(to_date('2008-10-07','YYYY-MM-DD'));
insert into date_test values(to_date('2008-10-06','YYYY-MM-DD'));
Когда вы попытаетесь вставить дату, которая приходится на воскресенье, на ней будет написано:
ORA-02290: check constraint (SYS.DAY_IS_NOT_SUNDAY) violated
Комментарии:
1. Существуют ли опасения по поводу локализации при использовании этого метода? Всегда ли to_char(…, ‘ДЕНЬ’) возвращает английские названия дней?
2. Хороший момент, я обновил ограничение, установив NLS_DATE_LANGUAGE= АНГЛИЙСКИЙ. По-видимому, у TO_CHAR(sysdate, ‘D’) здесь аналогичная проблема, потому что дата, которая кодируется как 1, варьируется в разных регионах.
3. Просто предложение: если вы используете
'fmDAY'
формат, вы можете изменить сравнение на простое равенство= 'SUNDAY'
.
Ответ №2:
Не уверен в фактическом ограничении, но вы можете использовать функцию:
TO_CHAR(sysdate, 'D');
чтобы получить день недели в виде целого числа, затем выполните небольшую проверку