繁体   English   中英

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

[英]PL/SQL Creating a trigger that checks SYSDATE against a range of date

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

我尝试将1月1日的值作为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;

这是您想要的吗?

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;

一种替代方法是:

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在这里

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语句中插入一个衬里

通过将sysdate截断为年份可以得到1月1日:“ trunc(sysdate,'yyyy')”。 因此,在这种情况下,您无需使用其他变量即可获得所需的结果,而只需通过

if sysdate < trunc(sysdate,'yyyy')+7 
then 
    raise application_error(-20004, 'error message'); 
end if; 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM