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

问题描述 投票:0回答:2

我正在创建一个表来检查各种日期约束,但 Oracle 对这个参数很挑剔。我的目标是预留一个房间来进行讲座,所以我想到了这样的事情:

.... prenotation_date 日期不为空, 起始日期日期不为空, 结束日期日期不为空,

检查 (/strarting_date > prenotation_date+3gg/ ) -> 您只能在要求预订后 3 天预订房间

检查(/*起始日期=结束日期*/)您预订的日期,这意味着您可以预订一天的房间

check(/*starting_date< ending_date */) in regards of the time你正在考虑的,这意味着你开始使用房间的时间必须早于你打算离开房间的时间(假设你想从8:00开始预订)上午至上午 10:00

问题是我不知道如何只考虑一部分数据,但我想有一种方法可以实现这一点,否则你应该创建 4 列而不是 2 列,并用于几个虚拟日期和另一个一个虚拟的时间,对我来说似乎很笨拙。所以我想问题是,我如何考虑单个组件中的日期类型?这可能吗?感谢您的关注,并对这么长的帖子表示歉意。

oracle date constraints ddl
2个回答
2
投票

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

  1. 起始日期 > 预注释日期 + 3
  2. 开始日期< ending_date
  3. TRUNC(开始日期)= TRUNC(结束日期)

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

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

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

测试用例:

创建表

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>

插入:检查起始日期< ending_date. Below insert should fail.

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:00
10: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>

0
投票

一般来说,您应该只学习如何在 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);
© www.soinside.com 2019 - 2024. All rights reserved.