-1

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の日付を操作するときに考慮しなければならない考慮事項や、この奇妙な動作を説明できるものはありますか?

4

2 に答える 2

0

関数F_WORKTIME_DIFFを見ずに何かを伝えることは困難です。F_WORKTIME_DIFFから返されるデータ型が何であれnumber、変数に割り当てられるとキャストされますtime。これが手がかりかもしれません。

于 2012-12-08T17:50:37.493 に答える
0

これはまさにあなたが探しているものではないかもしれませんが、最初の例は 2 つの日付の時間差を示しています。

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
/
于 2012-12-10T15:17:02.170 に答える