我正在创建一个表来检查各种日期约束,但 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 列,并用于几个虚拟日期和另一个一个虚拟的时间,对我来说似乎很笨拙。所以我想问题是,我如何考虑单个组件中的日期类型?这可能吗?感谢您的关注,并对这么长的帖子表示歉意。
您可以在以下条件下使用 CHECK 约束:
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>
一般来说,您应该只学习如何在 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);