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 约束:
- starting_date > prenotation_date + 3
- starting_date < ending_date
- 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: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>
通常,您应该只学习如何在 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);
我正在创建一个 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 约束:
- starting_date > prenotation_date + 3
- starting_date < ending_date
- 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: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>
通常,您应该只学习如何在 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);