1

我需要编写一个触发器来防止在周五下午 5 点到周一上午 9 点之间插入。

我是否走在正确的轨道上,认为我需要从 sysdate 中提取日期/时间并按照以下方式做一些事情

if
extract (day from sysdate) =>5 
AND extract (hour from sysdate) =>17 
AND extract (day from sysdate) =< 1 
AND extract (hour from sysdate) =<9
THEN
...

请让我知道这是否可怕地走上了错误的轨道。

我对“指定星期几”的搜索毫无结果感到沮丧,也许有人可以提出更好的搜索方法?

4

3 回答 3

6

我会尝试:

IF TO_NUMBER( TO_CHAR( SYSDATE, 'DHH24' ) ) > 516 OR
   TO_NUMBER( TO_CHAR( SYSDATE, 'DHH24' ) ) < 109 THEN

甚至只是

IF NOT TO_NUMBER( TO_CHAR( SYSDATE, 'DHH24' ) ) BETWEEN 109 AND 516 THEN

您需要注意,D星期几的值取决于当地日历,例如,一周的第一天可能是星期日或星期一。检查您的 NLS 设置。

于 2012-05-17T14:32:45.537 回答
1

就个人而言,我可能会将其分解为三个更易于编码的跨度。

if(      -- Disallow all day Sat & Sun
         to_char( sysdate, 'fmDay' ) in ('Saturday', 'Sunday') )  
    or  (    to_char( sysdate, 'fmDay' ) = 'Friday'
         and extract( hour from sysdate ) >= 17) -- Disallow on Friday after 5
    or  (    to_char( sysdate, 'fmDay' ) = 'Monday'
         and extract( hour from sysdate ) < 9) -- Disallow on Monday before 9
   )
then

这假定您的 NLS 设置始终设置为英语。你可以让它更通用,但它开始变得更复杂,因为不同的国家在不同的日子开始一周,所以 1 可能是星期一或星期日。

于 2012-05-17T14:31:26.350 回答
0

这是一个完成这项工作且不依赖于 NLS 设置的触发器:

create or replace trigger no_we
before insert or update or delete on dylans_table
for each row
when (sysdate between trunc(sysdate-9/24,'IW')+4+17/24 /*Friday 5pm*/ 
                  and trunc(sysdate-9/24,'IW')+7+ 9/24 /*Monday 9am*/)
begin
  raise_application_error(-20001, 'No working on weekends. Go live your life!');
end;
/

如果有人想知道,格式说明符“IW”是ISO 8601 周- 一种总是从星期一开始的星期。

于 2016-07-01T15:23:45.493 回答