Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 比较PLSQL上的日期_Oracle_Plsql_Database Trigger_Sysdate - Fatal编程技术网

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,但不起作用