在PLSQL上比较日期

时间:2018-11-25 14:46:34

标签: oracle plsql database-trigger sysdate

如果我尝试从表中删除并且表上的日期等于sysdate,则必须创建引发错误的触发器。

这是我的代码:

create or replace trigger nonViolation
  before insert or delete on reservation
  for each row
declare 
  error exception;
  error2 exception;
  dateres date:=sysdate;
begin
  if inserting then
     if :new.dateDep<dateres then 
         raise error;
     end if;
  end if;

  if deleting then
     if (:OLD.datedep=dateres)
     then 
        raise error2;
     end if;
  end if;

exception
  when error2 then
    raise_application_error(-20003,'supression impossible');
  when error then 
    raise_application_error(-20001,'reservation impossible');
end;

我试图删除包含今天的date 25-nov-18的行,并且该触发器不起作用。我尝试打印:old.datedepdateres的值,它们是相同的:

25-nov-2018
25-nov-2018

有人可以帮助我吗?谢谢

2 个答案:

答案 0 :(得分:2)

我怀疑您不允许SYSDATE包含当前时间和当前日期。如果您删除以下时间元素,则触发器可能会产生预期的结果:

    ...
    error2 exception;
    dateres date := trunc(sysdate);
begin
    ...
  

“它不起作用,”

如@bobjarvis所建议,您可能需要从datedep中剥离时间元素(取决于您如何填充):

if TRUNC(:OLD.datedep) = dateres

尝试使用完整的日期格式掩码,例如'yyyy-mm-dd hh24:mi:ss',然后查看实际的内容。

答案 1 :(得分:0)

在Oracle列上,日期类型为DATE的变量具有日期成分(年-月-日)加上时间成分(24小时制中的小时,分​​钟,秒)。
在屏幕上如何“查看”取决于开发工具和工具的本地配置。
如果时间部分是午夜(00:00:00),则某些工具不会显示时间部分。
此外,您所在的国家/地区也会影响工具显示日期的方式。
没有第二个参数的DATE类型的值上的TRUNC函数给出的DATE类型的值的组件时间为午夜(00:00:00)。

因此要比较当天使用的2个值:

Trunc(:old.datedep)=trunc(dateres)