PL/SQL 创建一个根据日期范围检查 SYSDATE 的触发器

Posted

技术标签:

【中文标题】PL/SQL 创建一个根据日期范围检查 SYSDATE 的触发器【英文标题】:PL/SQL Creating a trigger that checks SYSDATE against a range of date 【发布时间】:2019-06-02 19:44:03 【问题描述】:

创建一个触发器,在每年 1 月 1 日之后的一周内阻止 Table 的更新。

我尝试将 01 jan 的值作为 0101 的字符,并尝试添加 7 天但无济于事。有没有办法做到这一点?

BEFORE UPDATE ON employee
FOR EACH ROW
DECLARE
  first_jan date;
BEGIN
   first_jan := to_date('0101','DDMM');
   IF(SYSDATE < first_jan+7) THEN 
      RAISE_APPLICATION_ERROR(-20004,'Error Message');
END IF;
END;

【问题讨论】:

【参考方案1】:

按照你的意愿去做?

BEFORE UPDATE ON employee
FOR EACH ROW
BEGIN
   first_jan := to_date('0101','DDMM');
   IF (extract(month from SYSDATE) = 1 and
       extract(day from sysdate) <= 7
      ) THEN 
      RAISE_APPLICATION_ERROR(-20004,'Error Message');
    END IF;
END;

【讨论】:

谢谢!这确实可以满足我的要求,但我想知道是否还有其他方法 @Anthony 。 . .我不知道你指的是什么。这回答了你的问题。【参考方案2】:

另一种方法是:

CREATE OR REPLACE TRIGGER EMPLOYEE_BU
BEFORE UPDATE ON employee
FOR EACH ROW
BEGIN
  IF TO_NUMBER(TO_CHAR(SYSDATE, 'MMDD')) <= 107 THEN
    RAISE_APPLICATION_ERROR(-20004,'Error Message');
  END IF;
END EMPLOYEE_BU;

另一种选择是:

CREATE OR REPLACE TRIGGER EMPLOYEE_BU
BEFORE UPDATE ON employee
FOR EACH ROW
BEGIN
  IF TO_NUMBER(TO_CHAR(SYSDATE, 'WW')) = 1 THEN
    RAISE_APPLICATION_ERROR(-20004,'Error Message');
  END IF;
END EMPLOYEE_BU;

而 YAA(另一种选择)是:

CREATE OR REPLACE TRIGGER EMPLOYEE_BU
BEFORE UPDATE ON employee
FOR EACH ROW
BEGIN
  IF TO_NUMBER(TO_CHAR(SYSDATE, 'MMW')) = 11 THEN
    RAISE_APPLICATION_ERROR(-20004,'Error Message');
  END IF;
END EMPLOYEE_BU;

dbfiddle here

【讨论】:

【参考方案3】:

DDD 是一年中的某一天。

SQL> select date '2019-01-03' from dual;

DATE'2019
---------
03-JAN-19

SQL> select to_char(date '2019-01-03','ddd') from dual;

TO_
---
003

SQL> select to_char(date '2019-02-03','ddd') from dual;

TO_
---
034

这是一个可以插入 IF 语句的单行符

【讨论】:

【参考方案4】:

1 月 1 日的日期可通过将 sysdate 截断为年份来获得:“trunc(sysdate,'yyyy')”。因此,在这种情况下,您无需额外的变量和

的单个函数调用即可获得所需的结果
if sysdate < trunc(sysdate,'yyyy')+7 
then 
    raise application_error(-20004, 'error message'); 
end if; 

【讨论】:

以上是关于PL/SQL 创建一个根据日期范围检查 SYSDATE 的触发器的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL 过程语法

PL/SQL:在由开始和结束定义的重叠日期范围内查找孤岛

PL/SQL 性能优化 - 根据记录更改计算总和和微分

PL/SQL 脚本验证

如何根据 PL/SQL 变量值检查输入参数值是不是存在作为列表?

创建一个表,其中动态 PL/SQL 中的“日期条件”