检查约束以确保日期不在未来?

     2023-05-09     136

关键词:

【中文标题】检查约束以确保日期不在未来?【英文标题】:Check constraint for making sure a date is not in the future? 【发布时间】:2011-01-19 18:43:52 【问题描述】:

我正在尝试创建一个表来记录对另一个表的估计小时数所做的更改。数据库作为一个整体是一个项目管理系统,供公司将工作分配给员工并为客户创建发票。

目前我有:

CREATE TABLE task_history
(
    task_history_id         NUMBER(5),
    previous_est_hours      NUMBER(3,1),
    change_date         DATE,
    reason_for_change       VARCHAR2(50),
    task_id             NUMBER(5),

CONSTRAINT TASKHIST_TASKHISTID_PK   PRIMARY KEY (task_history_id),
CONSTRAINT TASKHIST_TASKID_FK       FOREIGN KEY (task_id) REFERENCES task(task_id),
CONSTRAINT TASKHIST_TASKID_NN CHECK (task_id IS NOT NULL),
CONSTRAINT TASKHIST_CHANGEDATE_NONFUTURE CHECK (change_date <= sysdate)
);

change_date 不能是未来的日期,它必须是今天或过去。 最后一个检查约束是问题所在。据我了解,由于我忘记的原因,您不能使用 sysdate,但您不能。我还尝试了 GETDATE() 以及我在网上找到的所有其他变体。 我怎样才能完成这个可能很简单的任务?

【问题讨论】:

GETDATE() 是特定于 TSQL 的。 SYSDATE 是 PLSQL 特定的获取当前日期和时间的方法,而 CURRENT_TIMESTAMP 是 ANSI 替代方法(大多数数据库都支持)。你真的遇到错误了吗?因为这是我第一次听说不使用 SYSDATE,所以我想听听更多。您的 Oracle 版本也会有所帮助。 【参考方案1】:

您不能从检查约束中调用函数,因此最自然的方法是在 task_history 表上定义触发器,即

CREATE OR REPLACE TRIGGER task_change_date_in_past
  BEFORE INSERT OR UPDATE ON task_history
  FOR EACH ROW
BEGIN
  IF( :new.change_date > sysdate )
  THEN
    RAISE_APPLICATION_ERROR( -20001, 'Change date must be in the past' );
  END IF;
END;

【讨论】:

@Andomar - D'oh。你是对的。我做了那个更正。【参考方案2】:

在 11g 中,可以使用带有 sysdate 的检查约束:http://rwijk.blogspot.com/2007/12/check-constraints-with-sysdate.html

在 11g 之前你应该使用 Justin 的方法。

问候, 抢。

【讨论】:

【参考方案3】:
CONSTRAINT TASKHIST_CHANGEDATE_NONFUTURE CHECK (change_date <= sysdate)

这作为一个约束确实是有问题的。 考虑如果要更新一行(其他列)或停用/反应约束会发生什么。它不会检查原始日期,而是检查current SYSDATE!

我主张向表中添加另一列,默认为 SYSDATE,并构建一个约束或 TRIGGER,将新列(存储的 SYSDATE)与 change_date 进行比较。

【讨论】:

【参考方案4】:

我认为您可以定义一个用户定义的函数来执行该检查并在检查约束中使用它。

【讨论】:

据我所知,您不能从检查约束中调用用户定义的函数

Mysql触发约束检查

】Mysql触发约束检查【英文标题】:Mysqltriggerconstraintcheck【发布时间】:2014-06-2813:55:08【问题描述】:我不是数据库专家,我在做数据库项目时需要帮助。我使用phpmyadmin4.1.14版作为我的数据库服务器。我需要有一个约束,以确保... 查看详情

何时评估检查约束?

】何时评估检查约束?【英文标题】:Whenarecheckconstraintsevaluated?【发布时间】:2017-06-0719:29:34【问题描述】:我有一个记录表IDEntityIDValueStatus还有一个实体表IDCol1Col2CurrentRecordIDCurrentRecordID应该是与Entity绑定的Record,Status为0我有... 查看详情

如何使用 DB2 sql 检查不在两个表中的记录以获取另一个第三个表中的日期?

】如何使用DB2sql检查不在两个表中的记录以获取另一个第三个表中的日期?【英文标题】:HowtocheckrecordsnotintwotablesforadateinanotherthirdtableusingDB2sql?【发布时间】:2021-08-1609:58:52【问题描述】:我有一个Employee表,其中包含带有ID的... 查看详情

在 SQL 的检查约束内使用“不在”查询

】在SQL的检查约束内使用“不在”查询【英文标题】:Usinga\'notin\'queryinsideofacheckconstraintinSQL【发布时间】:2021-12-1508:27:21【问题描述】:我有两张桌子,一张是学生桌子,一张是员工桌子:createtablestudent(idintnotnullprimarykey)createta... 查看详情

如何在列上添加检查约束以进行更新

】如何在列上添加检查约束以进行更新【英文标题】:Howtoaddacheckconstraintoncolumnforupdate【发布时间】:2016-12-1914:32:24【问题描述】:我正在向表中添加一列,并希望对其设置一个约束,即在给定日期之前不允许对其进行更新,并... 查看详情

动画约束更改 layoutIfNeeded 缓慢

】动画约束更改layoutIfNeeded缓慢【英文标题】:AnimatedconstraintchangelayoutIfNeededslow【发布时间】:2012-12-3100:42:07【问题描述】:我正在尝试使用自动布局为我的ADBannerView在屏幕上和屏幕外设置动画。预自动布局(设置框架和动画)... 查看详情

使用 laravel 验证检查唯一的日期/时间

】使用laravel验证检查唯一的日期/时间【英文标题】:Checkingforuniquedate/timewithlaravelvalidation【发布时间】:2016-05-1000:01:05【问题描述】:我正在学习laravel验证。我的目标是能够检查数据库中的事件表,以确保没有具有相同日期和... 查看详情

使用 JPA 标准的“不在”约束

...erty1)));虽然我知道这行不通。在上述语法中,如何添加要检查的property1的集合/列表? 查看详情

检查日期范围的最快方法

】检查日期范围的最快方法【英文标题】:Fastestwaytocheckdaterange【发布时间】:2009-05-2115:20:53【问题描述】:我将事件存储在SQLServer2005中,其中事件发生的时间很重要,并且必须存储在数据库中。在where子句中编写日期范围检查... 查看详情

SQL查询以获取未来的日期记录(ALL)以及当前的日期记录

】SQL查询以获取未来的日期记录(ALL)以及当前的日期记录【英文标题】:SQLQuerytogetfuturedatedrecords(ALL)alongwithcurrentdatedrecords【发布时间】:2020-06-0514:24:32【问题描述】:Repostingthequestionwithbetterexamples-我有一个per_asg表,其中包含... 查看详情

在 BigQuery SQL 中:在满足日期约束时检查和更新表列值

】在BigQuerySQL中:在满足日期约束时检查和更新表列值【英文标题】:InBigQuerySQL:Tocheckandupdatetablecolumnvalueonsatisfyingthedateconstraints【发布时间】:2021-06-0712:59:51【问题描述】:有一个结构如下的bigquery表:StoreProductWeekbegindateWeekendda... 查看详情

查询日期数组以仅显示未来事件 - PHP

】查询日期数组以仅显示未来事件-PHP【英文标题】:Querydatearraytodisplayfutureeventsonly-PHP【发布时间】:2014-08-0822:59:47【问题描述】:在Wordpress中,我创建了一个名为“事件”的自定义帖子类型,并使用高级自定义字段添加到自定... 查看详情

以编程方式将Tableview滚动到未来日期

】以编程方式将Tableview滚动到未来日期【英文标题】:ScrollTableviewtofuturedatesprogramaticallyios【发布时间】:2018-11-2806:37:42【问题描述】:在我的应用程序中,我展示了一个包含11天数据的电视指南。它在数组中有从当前日期到10天... 查看详情

检查约束不允许我添加数据

】检查约束不允许我添加数据【英文标题】:Checkconstraintnotallowingmetoadddata【发布时间】:2019-10-2313:49:52【问题描述】:我有一个返回BIT的用户定义函数。1-如果日期重叠0-如果日期不重叠我已经测试了UDF,它似乎运行正常。这是... 查看详情

ios xcode 电容器故事板约束以停止状态栏挂在 web 视图的顶部

】iosxcode电容器故事板约束以停止状态栏挂在web视图的顶部【英文标题】:iosxcodecapacitorjsstoryboardconstrainttostopstatusbarhangingoverthetopofthewebview【发布时间】:2021-07-3116:44:44【问题描述】:xcode-webviewcontentisshowinginstatusbar在这篇文章中... 查看详情

如何在 mariaDB 中创建检查约束以检查 char 类型的多个值?

】如何在mariaDB中创建检查约束以检查char类型的多个值?【英文标题】:howtocreatecheckconstraintinmariaDBforcheckingchartypemultiplevalues?【发布时间】:2018-08-0104:13:19【问题描述】:我在***等QuestionAnswer网站的大学项目中工作,但在MariaDB中... 查看详情

检查以确保所有字段都已填写 Jquery

】检查以确保所有字段都已填写Jquery【英文标题】:ChecktomakesureallfieldsarefilledJquery【发布时间】:2017-07-0921:34:26【问题描述】:我正在尝试在jquery中为我的输入字段创建一个简单的验证器。目前我得到以下内容:functioncheckInputs()... 查看详情

Oracle - 查找不在表中的所有日期

】Oracle-查找不在表中的所有日期【英文标题】:Oracle-Findalldatesthataren\'tinatable【发布时间】:2013-01-1016:56:10【问题描述】:我们有一个包含DATE列的表。我们如何编写一个脚本来返回未来n年内我们在表格中没有给定周末日期的任... 查看详情