嘿,我想在我的数据库中插入日期值,但我希望工作日只能被接受!
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!
答案 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参数放入其中以确保在语言设置不是英语的oracle上运行时代码仍然有效。您应该注意,使用带有D格式说明符的TO_CHAR(返回1到7之间的数字)也不能免于语言变化,因为某些语言环境不认为星期日是1(本周开始)