允许工作日在数据库中使用SQL中的触发器

时间:2017-12-03 22:18:45

标签: sql oracle plsql triggers

嘿,我想在我的数据库中插入日期值,但我希望工作日只能被接受!

CREATE OR REPLACE TRIGGER JOB_VACANCY_DATE_DEADLINE_TRG
BEFORE INSERT OR UPDATE OF DATE_DEADLINE ON JOB_VACANCY FOR EACH ROW 
BEGIN
    IF TRUNC(DATEPART(DW,:NEW.DATE_DEADLINE)) = 1 OR TRUNC(DATEPART(DW,:NEW.DATE_DEADLINE)) = 7 THEN
    /* Issue error code (ORA-20000) and message */
    RAISE_APPLICATION_ERROR( -20000, 'Not allowed, ONLY WEEKDAYS');
    END IF;
END;

我得到了错误,我必须声明DATEPART或DATENAME!

2 个答案:

答案 0 :(得分:1)

datepart确定了Oracle函数(虽然它是一个有效的SQL Server函数!)。

相反,您可以使用to_char函数来提取星期几:

CREATE OR REPLACE TRIGGER JOB_VACANCY_DATE_DEADLINE_TRG
BEFORE INSERT OR UPDATE OF DATE_DEADLINE ON JOB_VACANCY FOR EACH ROW 
BEGIN
    IF TO_CHAR(:NEW.DATE_DEADLINE, 'D') IN (1, 7) THEN
        /* Issue error code (ORA-20000) and message */
        RAISE_APPLICATION_ERROR( -20000, 'Not allowed, ONLY WEEKDAYS');
    END IF;
END;

答案 1 :(得分:0)

不需要使用DATEPART(如果它甚至是你的oracle中的一个函数)并且你可能也不想使用TRUNC,因为它将日期舍入到指定的最接近的单位但它保持日期元素舍入到,所以这不仅仅是“星期六” - 它是星期六2017年12月2日或其他什么

你可能应该这样做:

IF (TO_CHAR(yourdate, 'fmDAY', 'NLS_DATE_LANGUAGE = ENGLISH') IN ('SATURDAY','SUNDAY') )
  RAISE...

它比使用trunc更具可读性/自我记录功能。我将NLS_DATE_LANGUAGE参数放入其中以确保在语言设置不是英语的or​​acle上运行时代码仍然有效。您应该注意,使用带有D格式说明符的TO_CHAR(返回1到7之间的数字)也不能免于语言变化,因为某些语言环境不认为星期日是1(本周开始)