Oracle Date减法和定义变量

时间:2018-04-20 11:04:26

标签: oracle date variables

我是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单身&但我不确定?提前谢谢。

2 个答案:

答案 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;