如何检查声明部分中的参数是否等于sysdate - 存储过程

时间:2017-06-02 14:16:27

标签: sql oracle stored-procedures plsql oracle11g

我在检查变量时遇到问题,当我尝试在日期转换这些变量时,在创建if statement时检查stored procedure

像这样的代码

 create or replace procedure test 
 as
   dan nvarchar2(2) :='1'; 
   mesec nvarchar2(2) := '1';
   godina nvarchar2(4) := '2016';
 begin
   if to_date(dan||mesec||godina,'dd-mon-yy') != sysdate
   then 
     for dan in 1..12 loop
       dbms_output.put_line(dan);
     end loop;
    end if;
 end;

这三个变量是nvarchar2,to_date函数作为参数需要什么。但是当尝试将这些变量转换为日期,并检查它是否等于sysdate时,请给我下一个错误

ORA-01861: literal does not match format string

我不知道如何修复它?

2 个答案:

答案 0 :(得分:1)

这将是一个相当长的评论,所以我把它放在答案中。

现在,让我们从头开始。为什么你有这个

  

ORA-01861:literal与格式字符串

不匹配

首先。

你最后的,代表日期,你在连接日期的不同部分之后的字符串文字看起来像这样

112016 

dd-mon-yy函数中使用的日期格式字符串(to_date())要求日期和月份由两位数字表示:日01和月01不是{{1在你的情况下,和1一样。因此,要成功执行1函数,它应该看起来像这样

to_date()

不喜欢这样(你的情况)

to_date('01012016', 'dd-mm-yy')

然后在比较这两个日期时你必须考虑日期的时间部分 - 你必须通过将to_date('112016', 'dd-mm-yy') 函数应用于TRUNC()来解决它(之后,时间默认为午夜,如果您只想比较两个日期,则正是您所需要的。)

条件变为

sysdate

如果您想采用另一种方式将to_date('01012016', 'dd-mm-yyyy') != trunc(sysdate) 转换为字符串并比较两个字符串文字,您还需要分别使用两位数日历和月份(sysdate01)或保持原样(每个都用一个数字表示)并在格式字符串中使用01格式修饰符来摆脱前导零。所以它看起来像这样

FM

OR

declare
  dan nvarchar2(2) :='01'; 
  mesec nvarchar2(2) := '01';
  godina nvarchar2(4) := '2016';
begin
  if godina||mesec||dan != to_char(sysdate, 'yyyymmdd'); 
  ...
end;

答案 1 :(得分:0)

这是正确的方法:

 create or replace procedure test 
 as
   dan nvarchar2(2) :='1'; 
   mesec nvarchar2(2) := '1';
   godina nvarchar2(4) := '2016';
 begin
  if godina||mesec||dan != to_char(sysdate,'yyyymmdd')
   then 
     for dan in 1..12 loop
       dbms_output.put_line(dan);
     end loop;
    end if;
 end;