2013-10-12 57 views
-1

我會從SQL Server 2005的內置功能安排它,每隔30-35分鐘執行一次。 以下是查詢:如何編輯此SQL Server查詢以更準確?

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分鐘它將總是-1nDays,而不是大約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

你每天都在倒數計數器。我只是在保費期開始時跟蹤,並在每次使用保費「功能」時檢查當前時間。這樣你就沒有持續的維護和完美的準確性。 – usr

+0

那麼如何用我當前的查詢來實現這一點? – oLdPkj

+0

完全不是因爲你不需要它們。這是開始的錯誤方法。 – usr

回答

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

+0

很好的解釋。對此,我真的非常感激。如果可能的話,我有幾個問題。因此,如果您在主帖子中查看了我的第二個查詢示例,您會看到我認爲如果ndays是更新,它也會更新PremStart,因此下次更新時它將在1天后再次更新。基本上不是像你所建議的那樣做,而是以另一種方式?另外,如果我使用你的方法,他們再次購買它會增加他們+30天,所以他們會有例如60 ..這不會造成問題嗎?如果您看到我的第二個查詢示例,請讓我知道。我會感激。 – oLdPkj

+0

我以爲我不會評論你的第二個查詢,因爲你自己已經認爲它不好。 :)雖然我不喜歡它,但有一點不同:您正在重寫'PremStart',因此失去了有關確切的開始日期/時間的信息。也許這種信息在你的情況下並不重要,但我個人很少會考慮這種方法(當然不是第一種解決方案)。但是,是的,這種方法相當於我所建議的,它確實每天更新'ndays'一次(可能會使您額外花費近30分鐘的時間)。 ... –

+0

至於在尚未解決的問題上增加額外的保費時間,我相信您可以在不更改「PremStart」的情況下增加「TotalDays」。根據我的建議,「ndays」值將在最接近的工作調用時相應更新,因爲它將被重新計算。它會看起來像像這樣:開始日期'10/1/2013',長度'30',最後一次計算的'ndays'值'16',你在長度('TotalDays')加上'30'使它成爲'60','PremStart'仍然是一樣的,在工作的下一次迭代中,「ndays」變成了「46」(或者「45」,取決於它被執行的實際時間)。 –