我是Oracle新手,但了解TSQL 为了测试日期减法的功能,我编写了以下代码:
define LaterDate = TO_DATE('05 Apr 2002');
define EarlierDate = &&LaterDate - 3;
SELECT TO_NUMBER(&&LaterDate - &&EarlierDate) as DATEDIFF from dual;
这不能按预期工作,而以下代码可以:
define LaterDate = TO_DATE('05 Apr 2002');
define EarlierDate = TO_DATE('02 Apr 2002');
SELECT TO_NUMBER(&&LaterDate - &&EarlierDate) as DATEDIFF from dual;
任何人都可以向我解释这种行为吗?我怀疑我对“变量”做了“错误”的事情也许使用double&&& vs单身&但我不确定?提前谢谢。
答案 0 :(得分:2)
如果你set verify on
那么你可以看到问题;你的第一次尝试得到:
define LaterDate = TO_DATE('05 Apr 2002');
define EarlierDate = &&LaterDate - 3;
SELECT TO_NUMBER(&&LaterDate - &&EarlierDate) as DATEDIFF from dual;
old:SELECT TO_NUMBER(&&LaterDate - &&EarlierDate) as DATEDIFF from dual
new:SELECT TO_NUMBER(TO_DATE('05 Apr 2002') - TO_DATE('05 Apr 2002') - 3) as DATEDIFF from dual
DATEDIFF
----------
-3
操作符从左到右进行评估,因为它们都处于同一级别;所以它首先
TO_DATE('05 Apr 2002') - TO_DATE('05 Apr 2002')
为零;然后(有效地)
0 - 3
是-3。
不需要TO_NUMBER()
,因为它已经是一个数字,您不应该依赖日期格式的NLS日期设置。无论如何,在这种情况下使用ANSI文字更容易;但重要的变化是在EarlierDate
定义中添加括号,以便首先评估其- 3
:
define LaterDate = DATE '2002-04-05'
define EarlierDate = (&&LaterDate - 3)
SELECT &&LaterDate - &&EarlierDate as DATEDIFF from dual;
old:SELECT &&LaterDate - &&EarlierDate as DATEDIFF from dual
new:SELECT DATE '2002-04-05' - (DATE '2002-04-05' - 3) as DATEDIFF from dual
DATEDIFF
----------
3
答案 1 :(得分:-1)
您必须从日期中减去时间段或间隔,而不仅仅是数字。
试试这个:
define LaterDate = TO_DATE('05 Apr 2002');
define EarlierDate = &&LaterDate - INTERVAL '3' DAY;
SELECT TO_NUMBER(&&LaterDate - &&EarlierDate) as DATEDIFF from dual;