oracle中检查约束操作中的DDL日期数据类型

DDL date data type in check constraint manipulation in oracle

我正在创建一个 table 来检查各种日期限制,但 oracle 在这个参数上有点棘手。我的目标是预留一定的房间让我们说一个讲座,所以我想到了这样的事情:

..... prenotation_date 日期不为空, starting_date 日期不为空, ending_date 日期不为空,

check (/strarting_date > prenotation_date+3gg/ ) -> 您只能在您询问的时间后 3 天预订房间预订

检查 (/* starting_date = ending_date */ ) 关于您预订的日期,这意味着您可以预订房间一天的周期

检查 (/* starting_date < ending_date */) 关于您正在考虑的 time,这意味着 您开始使用房间的时间必须早于您打算离开房间的时间(假设您要预订从 8:00 a.m. 到 10:00 a.m.

问题是我不知道如何只考虑一部分数据,但我想有一种方法可以做到这一点,否则你应该创建 4 列而不是 2 列,并为几个虚拟日期使用另一个是虚拟时间,对我来说似乎很笨拙。所以我想问题是,我如何考虑其单个组件中的日期类型?那有可能吗?感谢您的关注,抱歉这么久 post.

您可以在以下条件下使用 CHECK 约束:

  1. starting_date > prenotation_date + 3
  2. starting_date < ending_date
  3. TRUNC(starting_date) = TRUNC(ending_date)

starting_date > prenotation_date + 3 将确保在预订3 天后允许预订

starting_date < ending_date 将确保预订的时间始终早于出发时间

TRUNC(starting_date) = TRUNC(ending_date) 将确保当天完成预订。 即预订window仅限一天

测试用例:

创建TABLE

SQL> CREATE TABLE t(
  2  prenotation_date DATE NOT NULL, starting_date DATE NOT NULL, ending_date DATE NOT NULL);

Table created.

SQL>

添加检查约束

SQL> ALTER TABLE t ADD CONSTRAINT t_chk CHECK(
  2  (starting_date > prenotation_date + 3)
  3  AND (starting_date < ending_date)
  4  AND (TRUNC(starting_date) = TRUNC(ending_date))
  5  );

Table altered.

SQL>

插入:检查starting_date > prenotation_date + 3。下面的插入应该会失败。

SQL> INSERT
  2  INTO t VALUES
  3    (
  4      to_date('03/01/2015 00:00:00','mm/dd/yyyy hh24:mi:ss'),
  5      to_date('03/02/2015 08:00:00','mm/dd/yyyy hh24:mi:ss'),
  6      to_date('03/02/2015 10:00:00','mm/dd/yyyy hh24:mi:ss')
  7    );
INSERT
*
ERROR at line 1:
ORA-02290: check constraint (LALIT.T_CHK) violated


SQL>

INSERT:检查 starting_date < ending_date。下面的插入应该会失败。

SQL> INSERT
  2  INTO t VALUES
  3    (
  4      to_date('02/01/2015 00:00:00','mm/dd/yyyy hh24:mi:ss'),
  5      to_date('03/02/2015 10:00:00','mm/dd/yyyy hh24:mi:ss'),
  6      to_date('03/02/2015 08:00:00','mm/dd/yyyy hh24:mi:ss')
  7    );
INSERT
*
ERROR at line 1:
ORA-02290: check constraint (LALIT.T_CHK) violated


SQL>

INSERT : 当天完成支票预订。下面的插入应该会失败。注意时间 08:00:0010:00:00 分别表示开始时间和结束时间。

SQL>   INSERT
  2  INTO t VALUES
  3    (
  4      to_date('02/01/2015 00:00:00','mm/dd/yyyy hh24:mi:ss'),
  5      to_date('03/02/2015 08:00:00','mm/dd/yyyy hh24:mi:ss'),
  6      to_date('04/02/2015 10:00:00','mm/dd/yyyy hh24:mi:ss')
  7    );
  INSERT
*
ERROR at line 1:
ORA-02290: check constraint (LALIT.T_CHK) violated


SQL>

INSERT : 所有值都满足要求,下面的插入应该通过。

SQL> INSERT
  2  INTO t VALUES
  3    (
  4      to_date('02/01/2015 00:00:00','mm/dd/yyyy hh24:mi:ss'),
  5      to_date('03/02/2015 08:00:00','mm/dd/yyyy hh24:mi:ss'),
  6      to_date('03/02/2015 10:00:00','mm/dd/yyyy hh24:mi:ss')
  7    );

1 row created.

SQL>

通常,您应该只学习如何在 Oracle 和 SQL 中使用日期:) 有多种方法可以做到这一点。例如:

-- Check whether room was booked timely
alter table Reservations add constraint RC1
  check (trunc(starting_date, 'DD') >= trunc(prenotation_date, 'DD') + 3);

-- Disable booking ranges around midnight
alter table Reservations add constraint RC2
  check (trunc(starting_date, 'DD') = trunc(ending_date, 'DD'));

-- Check whether booked range exists
alter table Reservations add constraint RC3
  check (starting_date < ending_date);