2014-02-07 107 views
0

我想查詢多個日期範圍的數據。這是我寫的:MSSQL查詢幾個日期範圍

Select Datetime, Round(value,3) As v 
From myTable 
Where charfield = 'WHATEVER' 
And ((Datetime between '2014-02-01 00:00' AND '2014-02-01 23:59') 
    OR (Datetime between '2014-02-02 00:00' AND '2014-02-02 23:59') 
    OR (Datetime between '2014-02-03 00:00' AND '2014-02-03 23:59') 
    OR (Datetime between '2014-02-04 00:00' AND '2014-02-04 23:59')) 

但我只能從最後一個範圍('2014-02-04')的數據,我不知道爲什麼。我確定在其他時間段也有數據。

請忽略區間連續的事實,這只是一個例子。在實際代碼中,間隔範圍完全是任意的。

+3

正如一個側面說明,如果你關心的時候,它通常是更明智的使用半開區間(包括起點,獨家終點),並放棄使用'BETWEEN' - 即'DateTime> ='20140201'和DateTime <'20140202''是你的第一個範圍。 –

+0

[它似乎對我很好](http://sqlfiddle.com/#!3/16ac0/1) - 你確定那裏有數據嗎?您的查詢中是否有更多內容沒有將其簡化? – GarethD

+0

你是以字符串還是日期時間類型變量傳遞日期?您可以在varchar中隱式投射時發生一些錯誤 – jean

回答

0

當您使用之間以及列包含日期和時間 元素,你有什麼作爲最終值使用?您可能會意識到,對於不同類型的 ,存在不同的精度。更重要的是,假設 該類型是DATETIME,並且您使用以下謂詞。

WHERE 
orderdate BETWEEN '20070201' AND '20070228 23:59:59.999' 

這種類型的 精度爲三個三分之一毫秒。 的毫秒部分終點999不是精度單位的乘積,所以 SQL Server最終將該值舍入到2007年3月1日午夜。作爲 結果,您可能最終得到一些命令,不要假設 看到。總之,而不是BETWEEN,使用> =和<,並且此形式將 在所有情況下都能正常工作,包括所有日期和時間類型,而不管 時間部分是否適用。查詢的Microsoft SQL Server 2012 tranining套件70-461