【问题标题】:Integrity Constraints for date (using oracle) Current Date not working as it come up with error日期的完整性约束(使用 oracle)当前日期不起作用,因为它出现错误
【发布时间】:2022-01-16 12:32:06
【问题描述】:

我用过这个触发器:

CREATE OR REPLACE TRIGGER trg_chk_future
  BEFORE INSERT ON your_table
  FOR EACH ROW
BEGIN
  IF( :new.date_time < sysdate )
  THEN
    RAISE_APPLICATION_ERROR( -20001, 'date_time must be in the future' );
  END IF;
END;

但是,当前日期在输入时会出现错误,例如 12/12/2021(今天的日期),但 13/12/21 和今天日期之后的任何日期都有效。

任何想法有什么问题。

【问题讨论】:

  • 您只是错过了添加等号,例如:new.date_time &lt;= sysdate,具体取决于当前逻辑。

标签: sql oracle


【解决方案1】:

如果你真的插入了你在问题中写的值,谁知道你真正插入了什么。因为,这些是字符串,而不是日期值。因此,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>

【讨论】:

    猜你喜欢
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 2015-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-02
    • 1970-01-01
    相关资源
    最近更新 更多