2010-03-19 102 views
1

想象一下有兩個字段的表,一個是smalltimedate和一個int,另一個是大約1000行數據。我在查詢中所要做的是在2010年3月3日至2010年3月13日之間查找行的INT字段的平均值,並且僅當該條目在上午6點至晚上11點之間。在SQL Server中分別查詢smalldatetime的日期和時間?

我試圖

between '2010-03-03 06:00 AND 2010-03-13 23:00' 

然而,僅限制了最開始和結束時間。我可以用循環做到這一點,但我需要在相當大的日期範圍內運行相同的查詢,這將很快消耗服務器資源。有沒有辦法分別查詢日期和時間?

回答

3
Select ... 
From Table 
Where DateCol >= '20100303' 
    And DateCol < '20100314' 
    And DatePart(hh,DateCol) Between 18 And 23 

請注意,我使用嚴格小於20100314的比較,所以它會在2010年3月14日午夜之前返回任何內容。

編輯意識到你說的是PM而不是AM。

ADDITION在SQL中,語句「Foo Between DateA和DateB」被翻譯爲「Foo> = DateA和Foo < = DateB」。注意到該聲明的第二部分小於或等於到DateB。在我們的查詢中,我們希望在2010年3月13日到午夜之間包含所有內容。我通過將搜索範圍限制在以下,我想要搜索的那一天嚴格小於

對於小時,DatePart(hh,DateVal)將使用24小時制返回當天的小時。所以下午6點真的是18點。如果我們希望在下午6點到晚上11點之間,我們確實希望在18:00到23:00之間。

ADDITION在我的原始解決方案中出現了一個小問題。系統將返回時間在11點鐘時間內的任何值(例如11:01 PM,11:30 PM,11:50 PM等)。下面是將解決該另一種解決方案:

Select ... 
From Table 
Where DateCol >= '20100303' 
    And DateCol < '20100314' 
    And DateAdd(day, -DateDiff(Day, 0, [DateCol]), [DateCol]) Between '18:00' And '23:00' 

基本上,我使用的則DateDiff和使用DateAdd功能以剝離的值的日期部分,然後與我們想要的值進行比較。

+0

你能解釋一下之間的語法差異的where語句和這樣的: WHERE(TimeOrdPlaced BETWEEN '2010-01-31' 和 '2010-02-27')和(DATEPART(HH,TimeOrdPlaced)6至22 ) 我的結果不同,比使用相同日期範圍和時間的語法要高得多。 – Kylee 2010-03-23 19:33:33

+0

認爲這是更容易擴大我的帖子來解釋。 – Thomas 2010-03-23 21:49:31

+0

謝謝!這看起來像在工作。 – Kylee 2010-03-24 21:38:31

2

創建一個單獨的計算列作爲datepart(小時,日期列)* 60 + datepart(分鐘,日期列),或者只有一小時不需要小分辨率。堅持計算列可以索引它,然後你就可以單獨有效地尋找範圍。在SQL 2008中有一些改進(新的TIME類型)。