我在检查变量时遇到问题,当我尝试在日期转换这些变量时,在创建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
我不知道如何修复它?
答案 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)
转换为字符串并比较两个字符串文字,您还需要分别使用两位数日历和月份(sysdate
和01
)或保持原样(每个都用一个数字表示)并在格式字符串中使用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;