所以我有一個程序,我目前正在調試的過程中,我已經縮小到這個選擇語句。如何正確使用案例中的條款
注意:其中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(一週)添加到結束偏移量/銷售偏移量,並且如果它不符合該條件,則使用原始值。
基本上我的問題很簡單......我相信但我很難獲得解決方案。所以我想知道的是如何在where子句中正確使用case語句。如果我不想在where子句中使用這種形式的case語句,我會如何設置這個select語句。
任何幫助或建議,非常感謝。 謝謝。
這似乎不必要的複雜,但也許我錯過了一些東西。基本上,你正在試圖計算一個開始和結束的時間戳,並且我假設這個數據表中沒有存儲時間戳?我發現你的日子田地是一個整數,1週日到7週六。你的班次時間字段中存儲了什麼樣的數據? – 2012-03-20 20:46:35
您不能在SQL WHERE子句中執行PL/SQL賦值語句。 – GriffeyDog 2012-03-20 21:20:26