Oracle 比较PLSQL上的日期
如果我试图从表中删除,并且表上的日期等于Oracle 比较PLSQL上的日期,oracle,plsql,database-trigger,sysdate,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 i
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;
有人能帮我吗?谢谢我怀疑您没有考虑SYSDATE既包含当前时间又包含当前日期的事实。如果删除以下时间元素,您的触发器可能会产生所需的结果:
...
error2 exception;
dateres date := trunc(sysdate);
begin
...
“它不起作用,”
正如@bobjarvis所建议的,您可能需要从datedep
中删除时间元素(取决于您如何填充它):
尝试使用完整的日期格式掩码,如“yyyy-mm-dd hh24:mi:ss”,查看您实际拥有的内容。我怀疑您不允许SYSDATE包含当前时间和当前日期。如果删除以下时间元素,您的触发器可能会产生所需的结果:
...
error2 exception;
dateres date := trunc(sysdate);
begin
...
“它不起作用,”
正如@bobjarvis所建议的,您可能需要从datedep
中删除时间元素(取决于您如何填充它):
尝试使用完整的日期格式掩码,如“yyyy-mm-dd hh24:mi:ss”,查看您实际拥有的内容。在Oracle列上,日期类型的变量包含日期组件(年-月-日)和时间组件(24小时时钟中的小时、分钟、秒)。
您在屏幕上“看到”的方式取决于开发工具和工具的本地配置。
如果时间成分为午夜(00:00:00),则某些工具不显示时间成分。
您所在的国家/地区也会影响工具显示日期的方式。
不带第二个参数的日期类型值上的TRUNC函数给出的日期类型值的组成时间为午夜(00:00:00) 因此,要比较当天使用的两个值:
Trunc(:old.datedep)=trunc(dateres)
在Oracle上,日期类型的列和变量具有日期组件(年-月-日)和时间组件(24小时时钟中的小时、分钟、秒)。
您在屏幕上“看到”的方式取决于开发工具和工具的本地配置。
如果时间成分为午夜(00:00:00),则某些工具不显示时间成分。
您所在的国家/地区也会影响工具显示日期的方式。
不带第二个参数的日期类型值上的TRUNC函数给出的日期类型值的组成时间为午夜(00:00:00) 因此,要比较当天使用的两个值:
Trunc(:old.datedep)=trunc(dateres)
还需要将
if(:OLD.datedep=dateres)
更改为if TRUNC(:OLD.datedep)=dateres
。无论如何,当我尝试获取dateres的值时,我得到的是2018年11月25日,没有时间。我的表保留包含2018年11月25日这样的日期,而我得到的sysdate值是2018年11月25日,因此它们是相等的。我说的对吗?@Saad:无论你使用什么工具,它都只显示你所看到的日期值的日-月-年部分。但在Oracle中,所有日期值都包含年、月、日、小时、分钟和秒。不显示所有字段并不意味着它们不存在。而且,除了午夜,小时、分钟或秒字段中至少有一个包含非零值。@BobJarvis我该怎么办?我尝试使用trunc但不起作用还需要将if(:OLD.datedep=dateres)
更改为if trunc(:OLD.datedep)=dateres
。它不起作用,无论如何,当我尝试获取dateres的值时,我得到的是2018年11月25日,没有时间。我的表保留包含2018年11月25日这样的日期,而我得到的sysdate的值是2018年11月25日,所以它们相等。我说的对吗?@Saad:无论你使用什么工具,它都只显示你所看到的日期值的日-月-年部分。但在Oracle中,所有日期值都包含年、月、日、小时、分钟和秒。不显示所有字段并不意味着它们不存在。而且,除了午夜,小时、分钟或秒字段中至少有一个包含非零值。@BobJarvis我该怎么办?我尝试使用trunc,但不起作用