我将从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分钟将始终-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
与保费期有关的所有属性是什么?只是开始日期/时间和剩余天数?每天计数器滴答一下就足够了,但是每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
,因此使用诸如condition这样的条件的DELETE语句ndays = 0
肯定会错过它们。因此,我只是将条件更改为ndays <=0
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句