【发布时间】: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 的任何记录的状态。
到目前为止,我已经想到了这些可能的解决方案:
- 设置 SQL Server 作业以每秒运行一些更新脚本
- 在每个页面请求上使用应用程序服务器 (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