2012-10-02 14 views
1

的情況:再現週期在SQL腳本

用戶創建一個包含日期字段(DateOpened)的情況下記錄,並希望向客戶端發送,直到結案跟進每30天。 用戶將定期運行查詢(可能是每週),並提供「From」和「To」日期範圍,以指定記錄可能落入30天內的時間段。

請求:

我需要一個方法來識別記錄,其中所述用戶指定的日期範圍包括那些由於DateOpened日起30天的多個記錄。

UPDATE 這就是我昨晚在觀看第三部電視節目時突然想到的!

SELECT 
.... 
FROM 
.... 
WHERE 
(CAST((DATEDIFF(dd, Invoice.DateOpened @EndDate)/30) AS INT) - CAST((DATEDIFF(dd, Invoice.DateOpened, @StartDate)/30) AS INT)) >=1 
OR DATEDIFF(dd, Invoice.DateOpened, @StartDate) % 30 = 0 --this line to capture valid records but where From and To dates are the same 
+1

是否使用的是RDBMS? Sql Server,MySQL,Oracle,MS ACcess? –

+0

使用MS SQL服務器 – user1713370

回答

0

這是Microsoft SQL嗎?這是Express版嗎?只要不是Express,您可能需要考慮使用SQL Agent服務,它可以讓您安排可以針對數據庫運行的任務。一旦記錄達到30天,你想讓它做什麼?

+0

感謝Adam,我正在使用自定義報告實用程序來顯示網格中的記錄,並允許用戶指定如From和To日期之類的條件並將結果發送到Excel。用戶需要自行決定是否運行該功能。 30天倍數將需要落入用戶指定的日期範圍內。 – user1713370

+0

亞當,回答你的問題... 我相信它是用戶擁有的完整的SQL服務器(不是表達),所以SQL代理應該可用。如果我使用SQLCMD執行SQL的運行並將數據導出爲csv文件,那麼您的建議可能是一種可能的解決方案。我會調查。謝謝Em – user1713370

0

您可以使用DATEDIFF函數來計算日期之間的差異。您可以使用模數(%)運算符來獲得除法運算的「餘數」。結合這兩個給你:

SELECT 
    .... 
FROM 
    .... 
WHERE 
    --In MS T-SQL, BETWEEN is inclusive. 
    DateOpened BETWEEN @UserSuppliedFromDate AND @UserSuppliedToDate 
    AND DATEDIFF(dd, DateOpened, getdate()) % 30 = 0 

這應該給你想要的結果。

編輯(舉這個例子嘗試在MSSQL):

DECLARE @Table TABLE 
(
    ID integer, 
    DateOpened datetime 
) 

DECLARE @FromDate as datetime = '1/1/2012' 
DECLARE @ToDate as datetime = '12/31/2012' 

INSERT INTO @Table VALUES (0, '1/1/1982') 
INSERT INTO @Table values (1, '1/1/2012') 
INSERT INTO @Table VALUES (2, '2/17/2012') 
INSERT INTO @Table VALUES (3, '3/16/2012') 
INSERT INTO @Table VALUES (4, '4/16/2012') 
INSERT INTO @Table VALUES (5, '5/28/2012') 
INSERT INTO @Table VALUES (6, '1/31/2012') 
INSERT INTO @Table VALUES (7, '12/12/2013') 

DECLARE @DateLoop as datetime 
DECLARE @ResultIDs as table (ID integer, DateLoopAtTheTime datetime, DaysDifference integer) 

--Initialize to lowest possible value 
SELECT @DateLoop = @FromDate 

--Loop until we hit the maximum date to check 
WHILE @DateLoop <= @ToDate 
BEGIN 
    INSERT INTO @ResultIDs (ID,DateLoopAtTheTime, DaysDifference) 
     SELECT ID, @DateLoop, DATEDIFF(dd,@DateLoop, DateOpened) 
     FROM @Table 
     WHERE 
      DATEDIFF(dd,@DateLoop, DateOpened) % 30 = 0 
      AND DATEDIFF(dd,@DateLoop,DateOpened) > 0 -- Avoids false positives when @DateLoop and DateOpened are the same 
      AND DateOpened <= @ToDate 
    SELECT @DateLoop = DATEADD(dd, 1, @DateLoop) -- Increment the iterator 
END 

SELECT distinct * From @ResultIDs 
+0

getdate()顯然是MSSQL特有的。 CURDATE()應該適用於MySQL。 – Traxxus

+0

謝謝Traxxus,我也想過使用MOD函數,但不知道如何構建我的語句來測試用戶輸入的「From」和「To」日期範圍。 – user1713370

+0

更新代碼以添加範圍檢查。 – Traxxus