如果你真的插入了你在问题中写的值,谁知道你真正插入了什么。因为,这些是字符串,而不是日期值。因此,Oracle 尝试将它们转换为有效的 DATE 数据类型值,并且 - 根据您所说的 - 失败了。
这意味着您应该实际插入DATE 值,如以下示例所示(触发器与您所做的完全相同):
SQL> create table your_table (date_time date);
Table created.
SQL> CREATE OR REPLACE TRIGGER trg_chk_future
2 BEFORE INSERT ON your_table
3 FOR EACH ROW
4 BEGIN
5 IF( :new.date_time < sysdate )
6 THEN
7 RAISE_APPLICATION_ERROR( -20001, 'date_time must be in the future' );
8 END IF;
9 END;
10 /
Trigger created.
测试:截断的 sysdate 设置为午夜(这是过去的,因此被拒绝):
SQL> insert into your_table values (trunc(sysdate));
insert into your_table values (trunc(sysdate))
*
ERROR at line 1:
ORA-20001: date_time must be in the future
ORA-06512: at "SCOTT.TRG_CHK_FUTURE", line 4
ORA-04088: error during execution of trigger 'SCOTT.TRG_CHK_FUTURE'
今年五月,也是过去:
SQL> insert into your_table values (date '2021-05-25');
insert into your_table values (date '2021-05-25')
*
ERROR at line 1:
ORA-20001: date_time must be in the future
ORA-06512: at "SCOTT.TRG_CHK_FUTURE", line 4
ORA-04088: error during execution of trigger 'SCOTT.TRG_CHK_FUTURE'
这个是在未来,所以接受:
SQL> insert into your_table values (date '2021-12-26');
1 row created.
SQL>
截至
当前日期在输入时出现错误,例如 2021 年 12 月 12 日(今天的日期)
也许你是想说
IF( :new.date_time < trunc(sysdate))
将sysdate 截断到今天的午夜。在这种情况下,今天的日期也被接受:
SQL> CREATE OR REPLACE TRIGGER trg_chk_future
2 BEFORE INSERT ON your_table
3 FOR EACH ROW
4 BEGIN
5 IF( :new.date_time < trunc(sysdate))
6 THEN
7 RAISE_APPLICATION_ERROR( -20001, 'date_time must be in the future' );
8 END IF;
9 END;
10 /
Trigger created.
SQL> insert into your_table values (date '2021-12-12');
1 row created.
SQL>