当 Value = GETDATE() 时触发更新记录

Posted

技术标签:

【中文标题】当 Value = GETDATE() 时触发更新记录【英文标题】:Trigger to update record when Value = GETDATE() 【发布时间】:2013-01-03 12:30:09 【问题描述】:

我对触发器的体验是,它在更新、插入或删除之后会执行某些操作。但是是否可以创建一个触发器以在今天的日期自动更新记录?例如,我有一个有 4 列的表格。

   StartDate         EndDate         Active          Expired 
---------------------------------------------------------------
   2013-01-03      2013-01-05          True           False

这是一条记录,我想要创建一个触发器,当它的EndDate = 今天的日期(GETDATE ())。我该怎么做?

【问题讨论】:

这听起来像是一项日常工作 - 以 link 为例。 我想这就是我现在必须学习的。谢谢:) 【参考方案1】:

不,据我所知,您不能在这种情况下使用触发器。 当数据/记录发生变化时,触发器被执行。 在您的情况下,数据没有变化,只是时间在流逝。

寻找“SQL 作业”来完成此任务。

【讨论】:

【参考方案2】:

要使您的列ActiveExpired 以您想要的方式运行,您应该将它们设为计算列。这些列的 sql 将是这样的(假设它们是 DATE 列):

--For column Active
CASE WHEN EndDate < CONVERT(DATE,GETDATE()) THEN 1 ELSE 0 END

--For Column Expired
CASE WHEN EndDate >= CONVERT(DATE,GETDATE()) THEN 1 ELSE 0 END

【讨论】:

【参考方案3】:

在您的情况下,您有两个选择:

创建一个视图(将getdate()转换为112以去除时间):

create view <your view name>
as
    select
        T.StartDate,
        T.EndDate,
        case when T.EndDate <= convert(nvarchar(8), getdate(), 112) then 1 else 0 end as Active,
        case when T.EndDate <= convert(nvarchar(8), getdate(), 112) then 1 else 0 end as Expired
    from <your table> as T

然后您可以从视图中选择数据(顺便说一句,我认为您不需要这两列,因为它们相互依赖)

或者您可以创建一个 SQL 作业来检查日期是否等于今天并更新您的列。

【讨论】:

以上是关于当 Value = GETDATE() 时触发更新记录的主要内容,如果未能解决你的问题,请参考以下文章

插入和更新时触发添加修改日期

使用触发器来获取GETDATE()

子查询返回超过 1 个值 - 我的触发器无法处理多个行更新

SQL Server 根据字段的值触发插入和/或更新的记录

当isedit !=1时,在更新时触发,防止更新。

触发器-当一个表更新时,将数据插入另一张表中