2015-12-30 62 views
0

早上好,SQL日期時間自動化

我在試圖刪除一些手工錄入的在檢索已通過我們的接口傳輸結果的每週成交量幾個查詢的過程很。即日期時間函數和幾個case函數。我想先處理日期時間,因爲只有在添加新客戶時,不需要每週更新案例陳述。

在過去,我們一直在手動編輯數據以選擇最近7天的數據。

例子:

WHERE (MessageReceivedDateTime >= '12/23/15 05:00' 
    AND MessageReceivedDateTime < '12/28/15 05:00') 

我可以使用下面的建議代碼來檢索過去的7天值得我們的數據庫中的數據,似乎有一些價值失蹤的日子之一。我認爲這是因爲我沒有查詢中的時間偏移量。

建議:更新這個目標

(MessageReceivedDateTime between DateAdd(DD,-7,GETDATE()) and GETDATE()) 

部分是爲了確保我們並不需要每週手動修改的日期/時間。我做了Google搜索並搜索了論壇,但沒有看到任何與此問題相關的內容。任何額外的幫助/解釋將不勝感激。

如果我錯誤地選擇了tSQL,我的SQL培訓全部在工作中,並且我們有Oracle和Microsoft SQL Server Management Studio,我還想在Management Studio中運行上述查詢並相信他們是tSQL。

----編輯提供最終的解決方案----

DECLARE @StartTime DATETIME = (DATEADD(Day, 0, DATEDIFF(Day, 0, GetDate())-7)); 
    DECLARE @EndTime DATETIME = DATEADD(Day, 0, DATEDIFF(Day, 0, GetDate())); 
    SET @StartTime = DATEADD(hh,(-dbo.fn_GetUTCOffset(@StartTime)),@StartTime); 
    SET @EndTime = DATEADD(hh,(-dbo.fn_GetUTCOffset(@EndTime)),@EndTime); 

    WHERE MessageReceivedDateTime >= @StartTime 
      AND MessageReceivedDateTime < @EndTime 

在我的特殊情況下,我擔心在最後一天的唯一的事情是確保考慮到我的UTC偏移。我使用我們設置的-dob.fn處理了這個問題。它將根據一年中的時間添加5或4個。

+0

哪些值似乎缺少 – Paparazzi

+0

飛盤,我比較了兩個查詢被使用,並且使用DateAdd之間留出約5000結果第一查詢的當天。我預計這些數字會更接近現貨。雖然我認爲Steven對使用日期時間的Getdate函數的解釋是減去7天,但將其作爲清晨,並且我希望檢索的是如果兩個查詢的工作類似,則需要比較整個天的值。 –

+0

但是你甚至沒有用> 12/23/15 05:00 – Paparazzi

回答

1

GETDATE函數返回NOW的DATETIME。如你所做的那樣,減去7天將返回7天前的日期,但是現在的時間。

例: NOW:二○一五年十二月三十〇日12:37:45.143 使用DateAdd - 7:2015年12月23日12:37:45.143

如果您想具體一天的時間,那麼你將不得不做更多的工作。

DECLARE @MyTime TIME = '05:15' --This can be changed to whatever time you would like. 
DECLARE @StartTime DATETIME = CONVERT(VARCHAR(10), CAST(GETDATE() AS DATE)) + ' ' + CONVERT(VARCHAR(10), @MyTime) 
DECLARE @EndTime DATETIME = CONVERT(VARCHAR(10), CAST(DATEADD(DAY, -7, GETDATE()) AS DATE)) + ' ' + CONVERT(VARCHAR(10), @MyTime) 

它可以在where子句中的查詢關鍵詞,比如

(MessageReceivedDateTime between @StartTime and @EndTime) 
+0

奇怪的是'GetDate()'被視爲[運行時常量函數](http://blogs.msdn.com/b/conor_cunningham_msft/archive/2010/04/23/conor-vs-runtime-constant-functions.aspx )在一個查詢中。 ([參考](http://sqlblog.com/blogs/andrew_kelly/archive/2008/03/01/when-a-function-is-indeed-a-constant.aspx))捕捉當前日期/時間在一個變量中,然後根據需要使用該值。這在多個語句中更爲重要,例如在存儲過程中,值可能會從一個語句更改爲下一個語句。 – HABO

+0

@Steven,謝謝你的協助。我對你的答案做了一個變化,以做我所需要的。 –

0

可以通過轉換爲date排除時間部分解決您的第二個查詢:

(MessageReceivedDateTime between DateAdd(day, -7, CAST(GETDATE() as DATE)) and 
           CAST(GETDATE() as DATE) 
) 

不過,我不會用between這一點。更多的東西一樣:

(MessageReceivedDateTime >= DateAdd(day, -7, CAST(GETDATE() as DATE)) 
MessageReceivedDateTime < CAST(GETDATE() as DATE) 
) 

我不知道的邊界上的值是什麼,所以你可能要加上或減去「1」。

+0

缺少一個和。 – Paparazzi

+0

使用第二個代碼讓我看起來多了一天,而不是在7天內拉動它,這讓我有一天的時間,在這個例子中是第22天。然而在另外7天裏,總數與我所期望的相符。 –

+0

@ J.E.Flint。 。 。日期時間如何存儲在列中,是否存在時區問題? –