为什么sysdate中的日子在plsql触发器中不适用于星期一?

时间:2017-09-25 11:32:07

标签: sql oracle plsql

create or replace trigger trig1
before delete or insert or update on students 
begin
if( To_char(sysdate,'day') = 'monday' then
raise_application_error(-20500,'table is secured');
end if;
end;

我创建了触发器但它不适用于monday并且它在表上执行DML操作。我找到了一个解决方案 - 使用dy而不是白天 - 但为什么?

3 个答案:

答案 0 :(得分:4)

有两个原因。

当您使用day时,结果会用空格填充到最长名称,请尝试

SELECT '"'||To_char(sysdate, 'day')||'"'
FROM dual;

"monday   "

使用'fmday'来避免这种情况。

然后TO_CHAR()的结果取决于当前用户会话NLS_DATE_LANGUAGE设置。使用

To_char(sysdate, 'fmday', 'NLS_DATE_LANGUAGE = american') = 'monday'`

以独立于当前用户会话的设置。

答案 1 :(得分:3)

Wernfried Domscheit has answered "why"您的查询无效(TO_CHAR( datevalue, 'DAY' )右侧填充空格)。

您可以截断日期并将其与ISO周的开头(通常是星期一)进行比较,而不是依赖NLS_DATE_LANGUAGENLS_TERRITORY设置,如果查询在国际上使用可能会中断)这与这些设置无关:

create or replace trigger trig1
before delete or insert or update on students 
begin
  IF TRUNC( SYSDATE ) = TRUNC( SYSDATE, 'IW' ) THEN
    raise_application_error(-20500,'table is secured');
  END IF;
end;
/

答案 2 :(得分:0)

您可以使用日期代码:

msbuild test.sln /t:Rebuild /p:Configuration=Debug

文档:https://docs.oracle.com/database/121/SQLRF/sql_elements004.htm#SQLRF00210

  

D - 星期几(1-7)。此元素取决于会话的NLS区域。