私は現在、私がデバッグの過程にいる手続きを持っており、このselect文に絞っています。where節のcaseを正しく使用する方法
注:to_date( '')、3300,5220は、パラメータから来るものの表現です。
さて、これが行うことに仮定されたものを、オフセットのタイムスタンプであるパラメータを取ると、オフセット値
を引くことは、週の初めからによって行っている分の数です深夜の日曜日= 0です(したがって、真夜中の場合、オフセットは1440になります)。
オフセットをパラメータから差し引くと、曜日の先頭になります。次に、すでに設定されているテーブルからオフセット値を取得し、その値を週の先頭に追加してタイムスタンプを取得します。
これは、シフトの開始日と終了日を取得するために行われます。
私の元のコードは問題なく動作しますが、日曜日に入る土曜日の境界条件がありません。
SELECT SHIFT_ID_PK, SHIFT_NAME_FK,
SHIFT_START_DAY, SHIFT_START_TIME,
SHIFT_END_DAY, SHIFT_END_TIME,
SITE_ID_FK, SHIFT_DAY_ID,
STARTOFFSET, ENDOFFSET,
TO_TIMESTAMP_TZ(TO_CHAR((PSTARTTIMESTAMP - (VSTARTOFFSET/24/60)) + (STARTOFFSET/24/60), 'YYYY-MM-DD HH:MI:SS AM'), 'YYYY-MM-DD HH:MI:SS AM TZH:TZM') as SHIFT_START_DATE,
TO_TIMESTAMP_TZ(TO_CHAR((PENDTIMESTAMP - (VENDOFFSET/24/60)) + (ENDOFFSET /24/60), 'YYYY-MM-DD HH:MI:SS AM') ,'YYYY-MM-DD HH:MI:SS AM TZH:TZM') as SHIFT_END_DATE
from shift_tbl
WHERE
ENDOFFSET >= VSTARTOFFSET
and STARTOFFSET < VENDOFFSET
order by shift_start_date asc;
この境界条件を処理するために私が思いついたのは、以下で私がスクリプトでテストしたものです。
declare
VSTARTOFFSET integer;
VENDOFFSET integer;
SHIFTOFFSET integer;
PSTARTTIMESTAMP timestamp;
PENDTIMESTAMP timestamp;
begin
VSTARTOFFSET := 10020;
VENDOFFSET := 420;
PSTARTTIMESTAMP := TO_DATE('3/17/2012 23:00', 'mm/dd/yyyy hh24:mi');
PENDTIMESTAMP := TO_DATE('3/18/2012 7:00', 'mm/dd/yyyy hh24:mi');
SELECT SHIFT_ID_PK, SHIFT_NAME_FK,
SHIFT_START_DAY, SHIFT_START_TIME,
SHIFT_END_DAY, SHIFT_END_TIME,
SITE_ID_FK, SHIFT_DAY_ID,
STARTOFFSET, ENDOFFSET,
TO_TIMESTAMP_TZ(TO_CHAR((PSTARTTIMESTAMP - (VSTARTOFFSET/24/60)) + (STARTOFFSET/24/60), 'YYYY-MM-DD HH:MI:SS AM'),'YYYY-MM-DD HH:MI:SS AM TZH:TZM') as SHIFT_START_DATE,
TO_TIMESTAMP_TZ(TO_CHAR((PENDTIMESTAMP- (VENDOFFSET/24/60)) + (ENDOFFSET /24/60), 'YYYY-MM-DD HH:MI:SS AM'),'YYYY-MM-DD HH:MI:SS AM TZH:TZM') AS SHIFT_END_DATE
from SHIFT_TBL
where
case
when SHIFT_START_DAY = 7 and SHIFT_END_DAY = 1 then
SHIFTOFFSET:= ENDOFFSET + 10080;
and VENDOFFSET := VENDOFFSET + 10080;
else
SHIFTOFFSET := ENDOFFSET;
end
SHIFTOFFSET >= VSTARTOFFSET
and STARTOFFSET < VENDOFFSET
order by SHIFT_START_DATE asc;
end;
ご覧のとおり、where句のcase文をどのように処理するかはわかりません。基本的には、開始日が土曜日で、終了日が日曜日の場合、終了オフセット/販売オフセットに10080(1週間)を追加し、その条件を満たさない場合は元の値を使用します。
基本的に私の質問はかなり簡単です...私は信じていますが、私は解決策を得ることが困難です。だから私が知りたいのは、where節の中でcase文を適切に使う方法です。そして、where句の中でこのフォームのcase文を使用することを想定していないのであれば、このselect文をどのくらい正確に設定すればよいでしょうか。
ご意見やご提案は大変ありがとうございます。 ありがとうございます。
これは不必要に複雑に思えますが、多分私は何かを見逃しています。基本的に、開始と終了のタイムスタンプを計算しようとしていますが、このデータテーブルにタイムスタンプが格納されていないと仮定します。私はあなたの日のフィールドが整数であることを確認します。日曜日は1から土曜日は7です。シフトタイムフィールドにはどのようなデータが格納されていますか? –
SQL WHERE句内にPL/SQL代入文を実行することはできません。 – GriffeyDog