【问题标题】:How to constantly update a database table depending on the time?如何根据时间不断更新数据库表?
【发布时间】:2017-05-02 19:15:44
【问题描述】:

我有数百条记录,都带有到期日期时间列。像这样的:

Name         Expires               Status
-----------+---------------------+--------+
Apple1       2017-05-05 10:10:15    Live
Apple2       2017-06-01 18:15:03    Live
Apple3       2017-01-01 23:59:59    Dead
Apple4       2017-01-30 23:00:01    Draft
Apple5       2017-01-30 23:00:01    Queued

我想在到期日期时间过后更改Live 的任何记录的状态。

到目前为止,我已经想到了这些可能的解决方案:

  1. 设置 SQL Server 作业以每秒运行一些更新脚本
  2. 在每个页面请求上使用应用程序服务器 (ColdFusion 2016)。因此,每次请求页面时,它都会在应用程序的onRequestStart() 方法中运行此更新脚本。

两者看起来都有点“Web 1.0”,而且可能非常昂贵。我想我正在尝试做 Facebook 所做的事情,即它会在正确的时间到达后立即发布预定的帖子,但无法有效地做到这一点。

有人可以建议什么是实现这一目标的好方法吗?

【问题讨论】:

  • 为什么要更新它?只需检查与 sysdatetime 相比的日期时间(假设它们是同步的或基于您关心的是实际 dt)并在逻辑上确定状态而不是不断更新表。您将不得不查询表以获取 Expires dt...此时您知道它是否已过期,因此无需更新您将读取/用于某些逻辑的列。只需使用dt 本身就是逻辑。
  • @scsimon 因为有时人们喜欢手动提前过期记录。因此,应用程序中有一个选项可以使记录过期。因此,仅仅通过日期比较来确定记录是活的还是死的是行不通的。
  • 没关系,但这只是一个 IF 检查。伪:If(Status = 'Dead' or Expires < SysDateTime()) 'Your record is not live'
  • 不遵循这对建议的影响...
  • 听起来仍然只是根据记录的当前状态和/或到期日期计算某个状态的问题。这可能不止一种情况,但不明白为什么不能像@scsimon 和 Andrew 建议的那样用 CASE 处理。例如,"only a live records..." 场景可能会从 psuedo-sql 中的类似内容开始:CASE WHEN Status = 'Live' AND Expires < SysDateTime THEN 'Dead' ELSE Status END AS FinalStatus。那只会影响“现场”记录。其他一切都将保持现有状态。

标签: sql sql-server coldfusion sql-server-2014 coldfusion-11


【解决方案1】:

我会使用沿线的视图

SELECT
    [Name]
    ,[Expires]
    ,CASE
        WHEN GETUTCDATE() > [Expires] THEN 'Dead'
        ELSE [Status]
        END AS [view_Status]
FROM Table

或使用计算列作为执行相同操作的状态列。无论哪种方式,如果它已经过期,它将被列为“死亡”,如果还没有,那么它将抓取状态列。

【讨论】:

    猜你喜欢
    • 2012-02-12
    • 2019-03-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2014-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多