2008-12-26 60 views
0

我有一個表如何查詢SQL Server表。基於SQL Server 2005中有三個列的具體日期

我有興趣做一個查詢,檢索給定日期的所有消息,比如'12/20/2008'。不過,我知道只是做timestamp = '12/20/2008'的地方不會給我正確的結果,因爲這個字段是日期時間字段。

有人推薦使用DATEPART函數,並將年,月和日拉出時間戳,並驗證它們分別等於2008,12和20。它看起來像不會使用我在時間戳上的索引,並且最終會進行全表掃描。

那麼構建我的查詢的最佳方式是什麼,以便我利用我創建的索引?

回答

1
-- avoid re-calculating @MyDate +1 for every row 
DECLARE @NextDay DateTime 
Set @NextDay = @MyDate + 1 

SELECT 
    -- ... 
WHERE [timestamp] >= @MyDate AND [timestamp] < @NextDay 
+0

SQL服務器不夠聰明,不能理解它只需要爲語句計算@MyDate + 1一次嗎? – erikkallen 2008-12-26 19:52:38

+0

也許吧。不過,我知道它不會爲getdate()做這件事。當然這是一個函數調用,它有點不同。但是我對於在where子句中不需要的東西留下任何偏執。 – 2008-12-26 20:04:44

0

BETWEEN語句可以幫助您。

SELECT * 
FROM MyTable 
WHERE TimeStamp BETWEEN @Start AND @End; 

開始將需要像上午12:01你想要的消息的當天,和最終會像日下午11:59在同一天結束。

2

根據我的經驗,兩個日期時間變量的使用一直非常成功。決議的問題似乎不太可能。但是,要記住的重要事實是一個範圍(任何類型)都包含兩個端點。所以你不能在兩個日期間使用BETWEEN進行測試,因爲它包含了兩個日期。而是使用類似

的DateField> = @startdate AND的DateField < @EndDate

The Manual.

來吧夥計 - 這個文件是不是很難找到。 :D

0

BETWEEN does not do> =,<。它確實> =,< =,因爲這證明代碼:

declare @low datetime 
declare @high datetime 
set @low = getdate() 
set @high = @low+1 

select case when @low between @low and @high then 1 else 0 end, 
    case when @high between @low and @high then 1 else 0 end 

其結果將是1,1,表明=被施加到兩個邊界。

0

假設@date是你想要的所有消息的任何一天的日期時間datetime值,使用此

Where [timestamp] >= DateAdd(day, DateDiff(day, 0, @Date), 0) 
    And [timestamp] < DateAdd(day, DateDiff(day, 0, @Date), 1) 

這比使用CAST更快,更不用提的是,當使用CAST上日期時間,如果你投日期時間值中午整數後,

Declare @MyDate as Datetime 
Set @MyDate = '12/25/2008 12:01:00' 
Declare @IntVal Integer 
Set @IntVal = Cast(@MyDate as Integer) 
Select Cast(@IntVal as DateTime) 

將四捨五入到代表TNE第二天的日期整數。上面的腳本將輸出12/26/2008

相關問題