2 つの日付フィールドの差を取得する必要があります。大きい方の日付が null の場合は、SYSDATE
代わりに使用します。この要件があるため、この問題を解決する関数を作成しました (注: このコードは、私の個人的な好みではなく、組織の標準に従っています)
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
関数は既に存在し、1 日の労働時間を計算します (午前 12 時に誰も仕事をしていないと仮定します)。問題は、この関数を呼び出すときに、結果に追加の時間が含まれることです。関数でクエリを実行すると、期待される出力が返されるため、これは非常に奇妙です。
例 (重要: ペルーの日付形式はDD/MM/YYYY HH24:MI:SS です)
TABLEX
WORKFLOWID STARTDATE ENDDATE
1 '01/12/2012 10:00:00' null
サーバーの日が同じ日 (2012 年 1 月 12 日) であるが、より長い時間 (10:01:00) であると仮定して、次の関数を実行します。
SELECT F_GET_DIFFERENCE(1)
FROM DUAL;
結果は 14 です。
ここで、関数でクエリを実行し、サーバー時間を 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の日付を操作するときに考慮しなければならない考慮事項や、この奇妙な動作を説明できるものはありますか?