簡體   English   中英

Oracle約束日期檢查SQL

[英]Oracle Constraint Date Check SQL

我想在表上添加約束,以防止基於某些條件插入/更新記錄。

更具體地說,如果插入或更新了一條記錄,則兩個日期字段中的年份必須相同,如果active為“ Y”

create table MY_TABLE
(
  id                      NUMBER not null,
  active                  CHAR(1) ,
  date_one                DATE,
  date_two                DATE
)


/* Allowed : both dates are 2014 AND flag id 'Y'*/
insert into MY_TABLE(id, active, date_one, date_two) 
VALUES (1, 'Y', to_date('20141201', 'yyyymmdd') , to_date('20140101', 'yyyymmdd');

/* DISAllowed : dates have different year AND flag id 'Y'*/
insert into MY_TABLE(id, active, date_one, date_two) 
VALUES (2, 'Y', to_date('20151201', 'yyyymmdd') , to_date('20140101', 'yyyymmdd');

/* Allowed : dates have different year AND flag id is NOT 'Y'*/
insert into MY_TABLE(id, active, date_one, date_two) 
VALUES (3, 'N', to_date('20151201', 'yyyymmdd') , to_date('20140101', 'yyyymmdd');

非常感謝

添加約束是制定一些邏輯的問題,這些邏輯可以准確定義您要實現的業務邏輯。 在您的情況下,您希望ACTIVEN或日期中的年份必須相同。

您可以使用EXTRACT()函數來檢查年份。

SQL> select extract(year from sysdate) from dual;

EXTRACT(YEARFROMSYSDATE)
------------------------
                    2015

這使您的條件active = 'N' or extract(year from date_one) = extract(year from date_two) ,然后可以在表DDL中聲明:

create table my_table (
    id number not null
  , active char(1)
  , date_one date
  , date_two date
  , constraint chk_dates check ( 
      active = 'N' or extract(year from date_one) = extract(year from date_two) )
    );

這將為您提供所需的結果:

SQL> insert into MY_TABLE(id, active, date_one, date_two)
  2  VALUES (1, 'Y', to_date('20141201', 'yyyymmdd') , to_date('20140101', 'yyyymmdd'));

1 row created.

SQL> insert into MY_TABLE(id, active, date_one, date_two)
  2  VALUES (2, 'Y', to_date('20151201', 'yyyymmdd') , to_date('20140101', 'yyyymmdd'));
insert into MY_TABLE(id, active, date_one, date_two)
*
ERROR at line 1:
ORA-02290: check constraint (REF.CHK_DATES) violated


SQL> insert into MY_TABLE(id, active, date_one, date_two)
  2  VALUES (3, 'N', to_date('20151201', 'yyyymmdd') , to_date('20140101', 'yyyymmdd'));

1 row created.

我還將在ACTIVE列上添加單獨的約束,以確保它只能具有正確的值並在主鍵上

create table my_table (
    id number not null
  , active char(1)
  , date_one date
  , date_two date
  , constraint pk_my_table primary key (id)
  , constraint chk_my_table_active check ( active in ('Y', 'N') )
  , constraint chk_dates check ( 
      active = 'N' or extract(year from date_one) = extract(year from date_two) )
    );

如果您ACTIVE列可以有比Y或N多個值,那么你需要改變約束稍微考慮到這一點; 例如類似以下內容:

coalesce(active, 'X') <> 'Y' or extract(year from date_one) = extract(year from date_two)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM