PL / SQL在几周之间

时间:2012-05-17 14:20:25

标签: sql oracle plsql oracle11g

我需要编写一个触发器,防止在星期五下午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
...

如果这可能会走错路,请告诉我。

我觉得令人沮丧的是,我对“指定星期几之间”的搜索结果毫无结果,也许有人可以建议更好的搜索方法?

3 个答案:

答案 0 :(得分: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设置。

答案 1 :(得分: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可能是星期一或星期日。

答案 2 :(得分:0)

这是执行作业的触发器,不依赖于NLS设置:

$rootScope.hasAccess = function (type) {
  if ($rootScope.me && $rootScope.me.groups) {
    return $rootScope.me.groups.filter(function (group) {
      return group.id === type;
    }).length > 0;
  } else {
    console.log(type + ' cannot be verified. $rootScope.me has not been set');
  }
};
$rootScope.hasAdminAccess = $rootScope.hasAccess('admin');

如果有人想知道,格式说明符'IW'是ISO 8601 Week - 一种始终在星期一开始的星期类型。