2014-07-17 78 views
1

我有一個函數(daysBetween)錯誤日期差異

CREATE OR REPLACE FUNCTION daysBetween 
(
    p_date1 DATE, 
    p_date2 DATE 
) 
    RETURN NUMBER 
AS 
BEGIN 
    RETURN (TRUNC(p_date1) - TRUNC(p_date2)); 
END; 

有了這個功能,我有查詢

SELECT COALESCE(daysBetween(to_date('11-07-2003','mm-dd-yyyy'), 
     to_date(datetrx,'mm-dd-yyyy')),0) 
from payment; 

結果wrong.it顯示錯誤的區別。

+3

你測試了哪些數據,你期望得到什麼結果(以及爲什麼),以及你實際得到了什麼?什麼數據類型是'datetrx' - date或varchar2? –

回答

3

在你的previous question你說datetrxDATE,所以你不應該使用它作爲to_date()的參數。您正在對字符串進行隱式轉換,然後進行顯式轉換。從這個問題看起來你的NLS_DATE_FORMATdd/mm/yyyy。所以,你真的這樣做了第二個參數傳遞給函數:

to_date(to_char(datetrx, 'dd/mm/yyyy'),'mm-dd-yyyy') 

只要datetrx值的日部分是< = 12這樣就會出現工作,但會給你一個不同的日期比你開始 - 當你交換日期和月份的值。這可能是你爲什麼從函數中得到錯誤答案的原因。如果一天晚於本月12日,那麼它會出錯。

但你並不需要把它所有的轉換,只是做:作爲建議

SELECT COALESCE(daysBetween(to_date('11-07-2003', 'mm-dd-yyyy'), datetrx), 0) 
from payment; 

或者使用ANSI語法前:也有可能,你想比較反對七月

SELECT COALESCE(daysBetween(date '2003-11-07', datetrx), 0) 
from payment; 

11日而不是11月7日,即使你的NLS_DATE_FORMAT實際上是mm/dd/yyyy,也會給你錯誤的結果。無法分析任何樣本數據和預期結果以及實際結果。