Итак, у меня есть процедура, в которой я сейчас находится в процессе отладки, и я сузил ее до этого оператора select.как правильно использовать случай в where, где статья
Примечание: где 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;
Как вы можете видеть, я не уверен, как обрабатывать оператор case внутри предложения where. В основном то, что я пытаюсь сделать, это то, что начальный день - суббота, а конец дня - воскресенье, затем добавьте 10080 (одна неделя) к офсетному офсету/продавцу и если это не соответствует этому условию, используйте исходные значения.
В основном мой вопрос довольно прост ... Я верю, но мне трудно получить решение. Поэтому я хотел бы знать, как правильно использовать оператор case внутри предложения where. И если я не предполагаю использовать оператор case в этой форме внутри предложения where, как именно я бы настроил этот оператор select.
Любая помощь или предложения приветствуются. Спасибо.
Это кажется излишне сложным, но, возможно, мне что-то не хватает. В основном, вы пытаетесь рассчитать начальную и конечную временную метку, и я полагаю, что в этой таблице данных нет временных меток? Я вижу, что ваши дневные поля являются целыми числами, с 1 по воскресеньям до 7 в субботу. Какие данные хранятся в ваших полях времени переключения? –
Вы не можете делать утверждения назначения PL/SQL внутри предложения SQL WHERE. – GriffeyDog