【问题标题】:PL/SQL between day's of week星期几之间的 PL/SQL
【发布时间】:2012-05-17 14:20:25
【问题描述】:

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

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

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

【问题讨论】:

    标签: sql oracle plsql oracle11g


    【解决方案1】:

    我会尝试:

    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 但这些都不完全正确。您需要 >= 517 或
    • 根据贾斯汀的评论更正了经期开始边界。
    【解决方案2】:

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

    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 可能是星期一或星期日。

    【讨论】:

    • 我喜欢这个答案,因为它可以帮助我更多地了解如何使用条件逻辑来深入研究事物。此外,我可以看到您如何尝试保持我尝试这样做的方式,但是我的导师总是说更少的代码就是更多的代码。 :D
    【解决方案3】:

    下面是一个不依赖 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 Week - 一种总是从星期一开始的星期。

    【讨论】:

      猜你喜欢
      • 2015-07-24
      • 1970-01-01
      • 2015-10-13
      • 2013-01-09
      • 1970-01-01
      • 2011-10-31
      • 2018-03-18
      • 2013-12-31
      相关资源
      最近更新 更多