【问题标题】:Trigger to update record when Value = GETDATE()当 Value = GETDATE() 时触发更新记录
【发布时间】:2013-01-03 12:30:09
【问题描述】:
我对触发器的体验是,它在更新、插入或删除之后会执行某些操作。但是是否可以创建一个触发器以在今天的日期自动更新记录?例如,我有一个有 4 列的表格。
StartDate EndDate Active Expired
---------------------------------------------------------------
2013-01-03 2013-01-05 True False
这是一条记录,我想要创建一个触发器,当它的EndDate = 今天的日期(GETDATE ())。我该怎么做?
【问题讨论】:
-
这听起来像是一项日常工作 - 以 link 为例。
-
标签:
sql
triggers
sql-server-2012
getdate
【解决方案1】:
不,据我所知,您不能在这种情况下使用触发器。
当数据/记录发生变化时,触发器被执行。
在您的情况下,数据没有变化,只是时间在流逝。
寻找“SQL 作业”来完成此任务。
【解决方案2】:
要使您的列Active 和Expired 以您想要的方式运行,您应该将它们设为计算列。这些列的 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 作业来检查日期是否等于今天并更新您的列。