【问题标题】:How to expire a particular row in SQL Server once a date is reached?到达日期后如何使 SQL Server 中的特定行过期?
【发布时间】:2012-08-23 12:14:55
【问题描述】:

对于有经验的开发人员来说,这可能是一个非常简单的场景,但作为一个初学者,我已经在这个问题上徘徊了很长时间。我正在 asp.net 中创建一个网站,用户可以在其中购买包。这些包裹有一些与之相关的到期日期(例如购买后 2 个月、6 个月等)。

问题是如何在我根据购买日期计算出的相同日期和时间准确地使每个包裹过期。这个怎么办?

我使用的是 SQL Server express edition 2008 和 asp.net 4.0。

【问题讨论】:

  • “过期”是什么意思?从数据库中删除?将字段标记为“过期”?
  • @WaqarJanjua 如果在 n 个月之后,这不是触发器。
  • @Meryovi 我猜他可能想在一段时间后自动删除。
  • @WaqarJanjua 我相信这将是一份工作,而不是触发器。
  • 我只是想告诉用户他购买的包裹现在已经过期了,这可以通过将状态更新为过期来完成。但是我什么时候应该触发这个更新查询?这就是问题所在。

标签: asp.net sql-server sql-server-2008-express


【解决方案1】:

您可以放置​​一个WHERE 子句,而不是删除记录,该子句将根据到期日期排除记录:

SELECT PackageName
FROM Package
WHERE ExpiryDate>GETDATE()

但是,如果您仍希望将它们从数据库中删除,您可以将 SQL Job 放置在每天/每小时运行的位置等处,这将删除已过期的记录:

DELETE FROM Package
WHERE ExpiryDate<GETDATE()

【讨论】:

    【解决方案2】:

    取决于您所说的过期的含义 - 您是要删除数据、标记记录还是只是从用户屏幕上隐藏数据。

    无论哪种方式,您都需要将到期日期作为列添加到您的表 (?packages) 中,并将计算出的到期日期保存到此列中。

    然后您可以选择:

    • 运行作业以删除/过期记录一旦过期,即CURRENT_TIMESTAMP is &gt; ExpiryDate(SQL Express 没有 SQL 代理,因此您需要例如编写 Windows 服务,或挂钩到 Windows 任务计划程序来执行这个)。
    • 或者,将您的应用程序更改为“检查”ExpiryDate 的值(例如 DateTime.Now &gt;= ExpiryDate),然后将用户锁定在 UI 之外/隐藏包。

    【讨论】:

    • 可能是windows服务可以在这种情况下工作。我会先试试这个选项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-04
    • 1970-01-01
    相关资源
    最近更新 更多