有人可以向我解释当查询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()()
答案 0 :(得分:6)
永远不要在to_date
上致电date
。
假设您的nls_date_format
设置为“DD-MON-RR”,这似乎是基于您的第一个查询,当您运行TO_DATE(SYSDATE, 'DD/MON/YYYY')
时,会发生以下情况。
to_date
不接受date
作为参数,只需varchar2
。因此Oracle必须使用您的会话date
从varchar2
到nls_date_format
进行隐式转换。to_date( '02-SEP-15', 'DD/MON/YYYY' )
故事的寓意 - 永远不要在to_date
上致电date
。它已经是date
了。将其转换为date
毫无意义。如果您只想将date
的时间部分设置为午夜,请使用trunc
。不要将date
转换为varchar2
回date
。