2015-12-07 219 views
-1

我需要查找两个日期之间的天数。两个日期之间的oracle差异

这里是代码:

declare 
datum DATE; 
sdate DATE; 
shpord NUMBER; 
rozdiel NUMBER; 
MESSAGE VARCHAR(2000) := 'Nemozete Uvolnit VO c.'; 

begin 
datum := TO_DATE('&OLD:NEED_DATE','DD.MM.YYYY'); 
sdate := TO_DATE(sysdate,'DD.MM.YYYY'); 

rozdiel := datum - sdate; 
IF rozdiel > 5 THEN 
    ERROR_SYS.Record_General('Nemozete Uvolnit VO c',''); 
END IF; 
end; 

我得到一个错误:

ORA-01858: a non-numeric character was found where a numeric was expected

+1

@Consider在未来,请也编辑出谢谢和其他类似的噪音。这将使您的建议编辑更完整。 – ryanyuyu

+2

**不要**:'sdate:= TO_DATE(sysdate,'DD.MM.YYYY');'。 'sysdate'是**已经是日期**。你的代码需要'sysdate'并隐含地将它转换成一个字符串,因为'to_date'需要一个字符串。用于隐式转换的格式基于'NLS_DATE_FORMAT'。然后'to_date'将该字符串翻译回日期。如果NLS_DATE_FORMAT'与您为日期指定的字符串不匹配,那么往返字符串和返回的往返行程将导致错误或不正确的结果。 –

+1

对'date'值调用'to_date()'将其转换为'date'显然是错误的。 –

回答

0

改变这一行:

sdate := TO_DATE('sysdate','DD.MM.YYYY'); 

到:

sdate := sysdate; 

您正尝试将STRING'sysdate'转换为日期,而不是sysdate的函数结果。

另外,请注意你的nls设置,如果你的日期格式没有设置为'dd.mm.yyyy',你会得到一个错误。

+0

你好,是科西嘉,但是有同样的错误。我认为有不同的数据类型存在问题。但我不知道在哪里。 – denn

+0

作为一个NUMBER的重要性。 – denn

+0

@denn:一旦我修复'sysdate'问题,它就可以工作......所以如果你仍然收到错误,请显示完整的脚本,显示完整的错误...所以我们可以看到错误/它在哪里发生。 (并显示全部输入:) :) – Ditto

3

不要在日期上拨打to_datesysdate已经是date。如果你想从当天的午夜减去datum

declare 
    datum DATE; 
    sdate DATE; 
    shpord NUMBER; 
    rozdiel NUMBER; 
    MESSAGE VARCHAR(2000) := 'Nemozete Uvolnit VO c.'; 
begin 
    datum := TO_DATE('&OLD:NEED_DATE','DD.MM.YYYY'); 
    sdate := trunc(sysdate); 

    rozdiel := datum - sdate; 
    IF rozdiel > 5 THEN 
    ERROR_SYS.Record_General('Nemozete Uvolnit VO c',''); 
    END IF; 
end;