如何制定允许用户从今天起只输入 DateTime 的 CHECK 约束?
Posted
技术标签:
【中文标题】如何制定允许用户从今天起只输入 DateTime 的 CHECK 约束?【英文标题】:How to make a CHECK constraint that allow user to only input DateTime from today and onwards? 【发布时间】:2019-04-28 13:33:23 【问题描述】:与标题一样,我正在尝试解决我的 CHECK 限制,即用户只能从今天起输入日期和时间。
这是我现在使用的SQL开发者版本(我查询了版本): - Oracle Database 12c 企业版 12.2.0.1.0 版 - 64 位生产 - PL/SQL 版本 12.2.0.1.0 - 生产
我尝试过的:
ALTER TABLE job_assignment
ADD CONSTRAINT chk_start_date CHECK ( start_date >=
SYSDATE()
);
但这给了我一个错误,ORA-00907:缺少右括号。
我也遇到过这个, 检查约束条件不能包含以下结构: - 子查询和标量子查询表达式 - 调用不确定的函数(CURRENT_DATE, CURRENT_TIMESTAMP、DBTIMEZONE、 本地时间戳,会话时区, SYSDATE、SYSTIMESTAMP、UID、USER 和 USERENV)
需要帮助。
【问题讨论】:
每次更新都会触发检查约束。即使这可行,这也意味着只要 start_date 出现,您的行就会被锁定,除了删除之外的所有内容。这就是你想要的吗? 是的,我的 start_date 在被输入到表后(假设它通过了 CHECK 约束)将不会被更改(永远)。它只需要在输入时检查用户是否输入了从今天或以后的日期和时间。行不会更改,因为此表会保留以供记录。 【参考方案1】:这将是一个触发器,例如
create or replace trigger trg_biu_jobas
before insert or update on job_assignment
for each row
begin
if :new.start_date < sysdate then
raise_application_error(-20001, 'Start date must be after "now"');
end if;
end;
【讨论】:
【参考方案2】:您可能必须在此处使用触发器:
CREATE TRIGGER chk_date_today
BEFORE INSERT ON job_assignment
FOR EACH ROW
BEGIN
IF (:NEW.start_date < SYSDATE()) THEN
raise_application_error(-20001, 'start_date must be after now');
END IF;
END;
【讨论】:
以上是关于如何制定允许用户从今天起只输入 DateTime 的 CHECK 约束?的主要内容,如果未能解决你的问题,请参考以下文章
需要使用 MVC 中的表单验证从服务器端验证 DateTime
数据库界面修改时,出现不允许从数据类型 datetime 到 int 的隐式转换.请使用 CONVERT 函数来运行此查询。
JavaScript --- 如何制定规则以确保用户输入的值介于两个特定数字之间