Итак, у меня есть процедура, которую я сейчас нахожусь в процессе отладки, и я сузил ее до этого оператора select.
Примечание: где 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.
Любая помощь или предложения приветствуются.Спасибо.