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
今日の日が と同じである場合はCallbackUpdatedDate
、calculateIntervalTo
等しい値が設定されます。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 ステートメントが意図したとおりに機能していないように見えますが、その理由がわかりません。