【发布时间】:2012-03-20 19:56:07
【问题描述】:
所以我有一个程序,我目前正在调试过程中,我已将其范围缩小到这个 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;
如您所见,我不确定如何处理 where 子句中的 case 语句。基本上我想做的是,如果开始日是星期六,结束日是星期日,然后将 10080(一周)添加到结束偏移量/销售偏移量,如果它不满足该条件,则使用原始值。
基本上我的问题相当简单......我相信但我很难获得解决方案。所以我想知道的是如何在 where 子句中正确使用 case 语句。如果我不打算在 where 子句中使用这种形式的 case 语句,我将如何设置这个 select 语句。
非常感谢任何帮助或建议。 谢谢。
【问题讨论】:
-
这似乎不必要地复杂,但也许我错过了一些东西。基本上,您正在尝试计算开始和结束时间戳,我假设此数据表中没有存储时间戳?我看到您的日期字段是一个整数,从 1 代表星期日到 7 代表星期六。您的轮班时间字段中存储了哪些类型的数据?
-
不能在 SQL WHERE 子句中执行 PL/SQL 赋值语句。