Oracle 10gr2: предотвратите какие-либо даты, которые выпадают на воскресенье?

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

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