2012-12-08 116 views
-1

我需要獲取2個日期字段的差異,如果更大的日期爲空,那麼我將使用SYSDATE來代替。有了這個需求,我創建瞭解決這個問題(注:此代碼將按照組織的標準,而不是我個人的口味)的函數日期差異得到不同於select語句的結果

CREATE FUNCTION F_GET_DIFFERENCE (P_WORKFLOWID NUMBER) 
RETURN NUMBER --result in minutes 
IS 
    TIME NUMBER; 
BEGIN 
    TIME := 0 
    SELECT 
     F_WORKTIME_DIFF(NVL(X.ENDDATE, SYSDATE), X.STARTDATE) 
    INTO 
     TIME 
    FROM 
     TABLEX X 
    WHERE 
     X.WORKFLOWID = P_WORKFLOWID; 

    RETURN TIME; 
EXCEPTION 
    WHEN OTHERS THEN 
     RETURN 0; 
END; 

F_WORKTIME_DIFF功能已經存在,並計算一天的工作時間(assumming沒有人在上午12點工作,以及類似的事情)。問題是當調用這個函數時,結果會包含額外的時間。這很奇怪,因爲在函數中執行查詢時,它會返回預期的輸出。

實施例(重要的是:在祕魯日期格式是DD/MM/YYYY HH24:MI:SS

TABLEX 

WORKFLOWID  STARTDATE    ENDDATE 
    1    '01/12/2012 10:00:00'  null 

Assumming服務器一天是在同一天(2012年1月12日),但更長的時間(10點01分00秒),我們執行功能:

SELECT F_GET_DIFFERENCE(1) 
FROM DUAL; 

結果是:14.

現在,執行所述函數的查詢和具有服務器噸ime在10:02:00,結果是2(確切輸出)。

我甚至嘗試執行此

SELECT 
    F_WORKTIME_DIFF(NVL(X.ENDDATE, SYSDATE), X.STARTDATE) SELECT_WAY, 
    F_GET_DIFFERENCE(1) FUNCTION_WAY 
FROM 
    TABLEX X 
WHERE 
    X.WORKFLOWID = 1 

,其結果是(具有10:10:00服務器時間)

SELECT_WAY FUNCTION_WAY 
    10    24 

也許是我必須考慮到當任何代價與Oracle一起工作的日期在內部函數或任何可以解釋這種奇怪行爲的東西?

+4

投擲石頭和隱藏的手?請至少發佈爲什麼downvote。 –

+0

另一個*只是想downvote你的問題絕不*沒有評論? –

回答

0

如果沒有看到函數F_WORKTIME_DIFF就很難說出任何內容。 無論從F_WORKTIME_DIFF返回的數據類型是什麼,在分配給變量time時,它都會被輸出到number。這可能是一個線索。

+0

如果你檢查我的最後一個例子,我在'F_GET_DIFFERENCE'函數內部使用了'F_WORKTIME_DIFF'函數,並且在select語句中使用了'F_WORKTIME_DIFF'函數,並且我得到了2個不同的結果,這讓我覺得這個方法沒有涉及錯誤的輸出。 –

0

這可能不是正是你尋找,但第一個例子給你時間兩個日期之間的差異:

Select EXTRACT(HOUR FROM (SYSDATE - trunc(SYSDATE)) DAY TO SECOND) From dual 
/

Select 
    EXTRACT(hour From Cast(SYSDATE as timestamp)) hh, 
    EXTRACT(minute From Cast(SYSDATE as timestamp)) mi, 
    EXTRACT(second From Cast(SYSDATE as timestamp)) ss 
From dual 
/