2012-02-06 223 views
0

我需要搜索在特定日期輸入的行。SQL Server 2008搜索日期

但是,我需要搜索的列的數據類型是datetime,而參數的數據類型是Date

我可以使用查詢像

Select result 
from table 
where 
    convert(date, Mycolumn) = @selectedDate 

,但會影響查詢的SARGability並不會使用在mycolumn創建的索引。

我嘗試使用下面的查詢:

Select result 
from table 
where 
    Mycolumn 
     BETWEEN @selectedDate AND Dateadd(s, -1, Dateadd(D, 1, @selectedDate)) 

然而,這並不工作,因爲@selectedDate是日期型,第二,不能添加或刪除。

有人可以幫我一個工作查詢嗎?

謝謝。

+0

看看這裏:[http://stackoverflow.com/questions/4156011/how-to-select-rows-for-a-specific-date-ignoring-time] [1] – ParPar 2012-02-06 07:29:54

回答

0
Select result 
from table 
where 
    Mycolumn >= @selectedDate 
AND Mycolumn < Dateadd(D, 1, @selectedDate) 
+0

謝謝!這將做我想要的:) – IamCP 2012-02-06 17:20:59

0

如果你需要做這些搜索了很多,你可以添加一個計算,堅持執行轉換到DATE柱,把一個指標就可以了,然後在該列

ALTER TABLE dbo.YourTable 
ADD DateOnly AS CAST(MyColumn AS DATE) PERSISTED 

搜索由於它是持續的,所以只有在MyColumn值發生變化時纔會(重新)計算,例如它不是對存儲函數的「隱藏」調用。由於它的持續存在,它也可以被索引並使用就像任何其他的定期專欄:

CREATE NONCLUSTERED INDEX IX01_YourTable_DateOnly ON dbo.YourTable(DateOnly) 

然後執行:

SELECT result FROM dbo.YourTable WHERE DateOnly = @SelectedDate 

由於額外的信息被存儲在表中,你會使用更多的存儲空間 - 因此您正在進行經典的「空間與速度」折衷;你需要更多的空間,但你的速度會更快。

2

這是我的理解是使用:

convert(date, Mycolumn) = @selectedDate 

是優化搜索。它將使用Mycolumn上的索引(如果存在)。這可以通過使用執行計劃輕鬆確定。