两个日期之间的oracle差异
Posted
技术标签:
【中文标题】两个日期之间的oracle差异【英文标题】:oracle difference between two dates 【发布时间】:2015-12-07 20:23:50 【问题描述】:我需要找出两个日期之间的天数。
代码如下:
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:在需要数字的地方发现了一个非数字字符
【问题讨论】:
@Consider 在未来,也请编辑出谢谢和其他类似的噪音。这将使您建议的修改更加完整。 不要:sdate := TO_DATE(sysdate,'DD.MM.YYYY');
。 sysdate
已经是一个日期。您的代码采用 sysdate
并隐式将其转换为字符串,因为 to_date
采用字符串。用于隐式转换的格式基于NLS_DATE_FORMAT
。然后to_date
将该字符串转换回日期。如果 NLS_DATE_FORMAT` 与您指定的返回日期的字符串不匹配,则往返字符串和返回将给出错误或不正确的结果。
在 date
值上调用 to_date()
以将其转换为 date
是完全错误的。
【参考方案1】:
不要在约会时打电话给to_date
。 sysdate
已经是 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;
【讨论】:
【参考方案2】:改变这一行:
sdate := TO_DATE('sysdate','DD.MM.YYYY');
到:
sdate := sysdate;
您正在尝试将 STRING 'sysdate' 转换为日期,而不是 sysdate 的函数结果。
另外,请注意您的 nls 设置,如果您的日期格式未设置为“dd.mm.yyyy”,您将会收到错误消息。
【讨论】:
你好,是的,但是有同样的错误。我认为不同的数据类型存在问题。但我不知道在哪里。 需要一个数字。 @denn:一旦我解决了“sysdate”问题,它就对我有用……所以如果你仍然遇到错误,请显示完整的脚本,显示完整的错误……所以我们可以看到发生了什么错误/发生的位置。 (并显示完整的输入:)) @denn:在 cmets 中发布代码的可读性不是很高。请编辑您的原始帖子。并请包括错误中提到的 # 行。 @Ditto,是的,它确实很痛,尤其是如果NLS_DATE_FORMAT
与 to_date
上的显式格式不匹配。以上是关于两个日期之间的oracle差异的主要内容,如果未能解决你的问题,请参考以下文章