当一个项目的 ExpiryDate 值是过去的时候,如何将它标记为“已过期”?

elw*_*wyn 4 sql-server-2008 sql-server constraint best-practices

我有一个项目表,每个项目都有一个状态和到期日。

强制执行此操作的最佳方法是什么:

when ExpireyDate > DateTime.Now
update Status to "expired"
Run Code Online (Sandbox Code Playgroud)

我可以有一个定期运行的存储过程,它根据需要检查所有项目和更新。但是,我想避免项目过期的任何延迟,并被标记为过期。

有没有更好的方法来做到这一点?数据库中的某种约束?

例如,拍卖网站将如何做到这一点?在非常精确的时间“结束”拍卖很重要。

编辑

我将gbn的答案标记为解决方案,因为它为我的问题提供了解决方案。但是我认为user212102是问题的关键 - 为什么我要存储状态,而不是根据项目的状态来计算它?我将研究实现这一目标的更好方法。

gbn*_*gbn 5

假设您希望过期标志是实时的...

您可以使用视图通过 GETDATE() 访问具有 CASE 的数据。计算列也有效。

注意:您不能索引视图,因为 GETDATE 是不确定的

CREATE TABLE myTestTable (foo int IDENTITY (1,1), bar varchar(100), ExpiryDate datetime)
GO
DECLARE @now datetime= GETDATE()
INSERT myTestTable (bar, ExpiryDate)
SELECT 'row1', @now - 2.1
UNION ALL SELECT 'row2', @now - 1.6
UNION ALL SELECT 'row3', @now - 1
UNION ALL SELECT 'row4', @now - 0.1
UNION ALL SELECT 'row5', @now + 2.1
UNION ALL SELECT 'row6', @now + 1.6
UNION ALL SELECT 'row7', @now + 1
UNION ALL SELECT 'row8', @now + 0.1
GO

CREATE VIEW MytestTableWithEXPIRED
WITH SCHEMABINDING
AS
SELECT
   foo, bar, ExpiryDate,
   CASE WHEN ExpiryDate < GETDATE()THEN 1 ELSE 0 END AS HasExpiredView
FROM
   dbo.myTestTable
GO
SELECT * FROM MytestTableWithEXPIRED
GO

ALTER TABLE MytestTable ADD 
    HasExpiredCol AS CASE WHEN ExpiryDate < GETDATE()THEN 1 ELSE 0 END
GO
SELECT * FROM MytestTable
GO
Run Code Online (Sandbox Code Playgroud)