0

2 つの日付の間の秒数を計算する関数があります。これらの秒数は、会社の営業時間内にのみ計算する必要があります。タスクが完了するまでに数日かかる場合があるため、日数を増やす while ループを作成しました

ここに私のループがあります:

    WHILE TO_DATE(TRUNC(dateIterator),'YYYY-MM-DD') < TO_DATE(TRUNC(CallbackUpdatedDate),'YYYY-MM-DD') LOOP
 calculateIntervalFrom := null;
calculateIntervalTo := null;

SELECT THIS_DATE_OPENING,
 THIS_DATE_CLOSING,
 NEXT_DATE_OPENING
INTO thisDateOpening, thisDateClosing, nextDay
FROM KS_DRIFT.SYS_DATE_KS
WHERE THIS_DATE = dateIterator;

-- gets calculated from
calculateIntervalFrom := thisDateOpening;

-- Gets calculateTo
IF dateIterator = TO_DATE(TRUNC(CallbackUpdatedDate),'YYYY-MM-DD') THEN
calculateIntervalTo := CallbackUpdatedDate;
ELSE
calculateIntervalTo := thisDateClosing;
END IF;
fromSeconds := abs(extract(second from TO_TIMESTAMP(calculateIntervalFrom))) + extract(minute from TO_TIMESTAMP(calculateIntervalFrom)) * 60 + extract(hour from TO_TIMESTAMP(calculateIntervalFrom)) * 60 * 60;
toSeconds :=abs(extract(second from TO_TIMESTAMP(calculateIntervalTo))) + extract(minute from TO_TIMESTAMP(calculateIntervalTo)) * 60 + extract(hour from TO_TIMESTAMP(calculateIntervalTo)) * 60 * 60;
intervalDifference := fromSeconds - toSeconds;

solvedSeconds := solvedSeconds + intervalDifference;
dateIterator := nextDay;
dbms_output.put_line(nextDay);

ちょっとした説明

そのため、値dateIterator(行が作成された日付) が行が最後に更新された時間 ( ) と同じではない限りCallbackUpdatedDate、テーブルから今日と翌日の営業時間を選択するという考え方です。KS_DRIFT.SYS_DATE_KS

今日の日が と同じである場合はCallbackUpdatedDatecalculateIntervalTo等しい値が設定されます。CallbackUpdatedDateそうでない場合は、値が に設定されます。thisDateClosing

次に、2 つの日付の間の秒数を計算し、それらをNUMBER solvedSeconds

その後dateIterator、次の開館日に設定します。dateIterator := nextDay;

これは機能しますが、2 回しか機能せず、単純にループを終了します。

計算しようとする 2 つの日付を次に示します。

作成: 2013-03-26 10:23:33

最終更新日: 2013-04-03 09:25:10

dbms_output.put_line(nextDay); outputs these two values: 

2013 年 3 月 27 日および 2013 年 3 月 27 日

一見すると、while ループ内の SELECT ステートメントが意図したとおりに機能していないように見えますが、その理由がわかりません。

4

2 に答える 2

2

日付をどのように扱うかは奇妙に見えます:

TO_DATE(TRUNC(dateIterator),'YYYY-MM-DD') 

したがって、dateIterator は切り捨てた日付です。つまり、時刻の部分を削除します。これにより、時刻が 00:00:00 に設定された日付が得られます。ただし、その日付に対して、文字列であるかのように to_date 関数を使用します。これは私には間違っているように見えます。

次に、selectステートメントで

WHERE THIS_DATE = dateIterator

そして、私は疑問に思います: 上記では、dateIterator から時間を削除する必要がありました。ここではありません。あなたのテーブルには、時間部分を含むdateIteratorのエントリがありますか?

これらの調査結果が問題の解決に役立つことを願っています。

于 2013-04-11T14:56:43.153 に答える