-1

我将从 SQL Server 2005 的内置功能中安排它每 30-35 分钟执行一次。以下是查询:

UPDATE PREMIUM_SERVICE2 SET ndays = ndays - 1 
WHERE strAccountID NOT IN
    (SELECT strAccountID FROM CURRENTUSER) 
    AND ndays > 0 AND (PremStart < DATEADD(DAY,-1,GETDATE()))
DELETE FROM PREMIUM_SERVICE2 where nDays = 0

但是有1个问题。一旦他们从网站获得溢价,它就会像这样添加它,10/11/2013 11:50:40 PM这意味着每 30 分钟执行这 2 个查询时,它将始终-1开启nDays而不是大约 1 天。所以,我想像这样添加它:

UPDATE PREMIUM_SERVICE2 SET ndays = ndays - 1, PremStart = GetDate() 
WHERE strAccountID NOT IN
    (SELECT strAccountID FROM CURRENTUSER) 
AND ndays > 0 AND (PremStart < DATEADD(DAY,-1,GETDATE()))
DELETE FROM PREMIUM_SERVICE2 where nDays = 0

因此,当它更新时,它也会更新,PremStart但这很糟糕,因为现在它可能会错过 30 分钟,而当他们有 30 天的保费时.. 它可能会错误地添加它们至少 1 天,这使得它有点糟糕,因为计划的作业将每 30 分钟执行一次。那么,如何编辑第一个查询以确保它更准确,并且只有在它真正通过时才会实际减去 1 天?我希望你们明白我的意思。我使用 SQL Server 2005

4

1 回答 1

0

与保费期有关的所有属性是什么?只是开始日期/时间和剩余天数?计数器每天滴答一次就足够了,但每 30-35 分钟一次?在某些时候,你会开始需要知道nDays今天是否已经被减去——你不能仅仅用这两列来判断,这就是问题所在。

如果任何需要知道剩余天数的东西都必须从表中的专用列中读取该值,而不是每次都根据固定的初始值计算它,那么您需要再分配一列,以便您可以以一种或另一种形式获取结束点——这是我能想象到的唯一方法,您可以在一天多次运行查询时跟踪剩余的天数。

例如,第三列可以是保费期的初始长度。这样您就可以使用以下语句进行更新ndays

UPDATE PREMIUM_SERVICE2
SET ndays = TotalDays - DATEDIFF(MINUTE, PremStart, GETDATE()) / 1440
WHERE strAccountID NOT IN
    (SELECT strAccountID FROM CURRENTUSER) 
    AND ndays > 0
;

TotalDays第三列的名称在哪里。正如你所看到的,ndays它不仅仅是递减的——它是在每次运行时计算的。

这实际上是您的应用程序(或任何需要该ndays值)可以做的而不是提取预先计算的值,即您可以将该表达式放在用于请求剩余天数的查询中,从而摆脱ndays. 当然,您还需要修改 DELETE 语句,将ndays条件替换为使用与上述相同或类似表达式的条件,以检查应删除哪些行。

不过,我并不是说ndays绝对不需要。拥有它可能是有价值的,并且在您的特定情况下分配它可能很有意义,但是您确实需要以某种形式记住终点。

还有一个潜在的问题需要解决,主要来自新的计算方式ndays。如果运行脚本的作业由于某种原因被延迟(停止一段时间,然后恢复),理论上可能会导致负值ndays,因此使用条件作为ndays = 0条件的 DELETE 语句必然会错过它们。因此,我只需将条件更改为ndays <=0.

于 2013-10-14T00:38:22.490 回答