sql oracle todate差异

时间:2015-09-02 16:35:55

标签: sql oracle date

有人可以向我解释当查询1返回查询2中使用的替换值时,为什么查询4的输出与其他输出不同,这应该等同于运行与查询4相同的操作?

我怀疑它与nls_date_format有关,但我不确定。

查询1

SELECT TO_DATE('02-SEP-15') - TO_DATE('01/JAN/07') FROM DUAL;
TO_DATE('02-SEP-15')-TO_DATE('01/JAN/07')
-----------------------------------------
                                     3166

SELECT TO_DATE(SYSDATE, 'DD/MON/YY') - TO_DATE('01/JAN/2007') FROM DUAL;

查询2

TO_DATE(SYSDATE,'DD/MON/YY')-TO_DATE('01/JAN/2007')
---------------------------------------------------
                                               3166

查询3

SELECT TO_DATE(SYSDATE, 'DD/MON/YYYY') - TO_DATE('01/JAN/2007') FROM DUAL;

TO_DATE(SYSDATE,'DD/MON/YYYY')-TO_DATE('01/JAN/2007')
-----------------------------------------------------
                                              -72732

查询4

function fn1(){

    return function fn2(){
    }

}

fn1()()

1 个答案:

答案 0 :(得分:6)

永远不要在to_date上致电date

假设您的nls_date_format设置为“DD-MON-RR”,这似乎是基于您的第一个查询,当您运行TO_DATE(SYSDATE, 'DD/MON/YYYY')时,会发生以下情况。

  1. to_date不接受date作为参数,只需varchar2。因此Oracle必须使用您的会话datevarchar2nls_date_format进行隐式转换。
  2. 将调用转换为to_date( '02-SEP-15', 'DD/MON/YYYY' )
  3. 由于您的字符串输入参数具有2位数年份但您的格式掩码指定了4位数年份,因此您会得到非常意外的结果。它不是被解释为2015年,而是被解释为第15年(2000年前的罗马帝国时期)。
  4. 现在你从0015年减去2007年,你得到的差异只有1,991年(确切地说是727,321天)。
  5. 故事的寓意 - 永远不要在to_date上致电date。它已经是date了。将其转换为date毫无意义。如果您只想将date的时间部分设置为午夜,请使用trunc。不要将date转换为varchar2date