如何编辑此SQL Server查询更准确?

时间:2013-10-12 20:06:22

标签: sql-server sql-server-2005

我将从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

但有一个问题。一旦他们从网站获得了溢价,它就会像10/11/2013 11:50:40 PM一样添加它,这意味着当这两个查询在上面执行时,每隔30分钟就会-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

1 个答案:

答案 0 :(得分: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