[SQL SERVER][Memo]搜尋datetime類型欄位三兩事

[SQL SERVER][Memo]搜尋datetime類型欄位三兩事

網友問題,相信搜尋datetiem類型欄位是很稀鬆平常的事,

由於datetime會精準到毫秒,如果想要搜尋某一天資料,

大部分都會轉型來比較,但where條件子句中如果針對欄位使用函數的話,

基本上是無法使用Index(如果資料量小就沒差了),

如何在兼具查詢效能條件下同時也符合需求呢?

這裡自己做個筆記紀錄一下,希望對該網友有所幫助。

 

		--create table
		Create Table AIDC
		(aCount integer IDENTITY(1,1) not NULL,aperson nvarchar(10),adept nvarchar(10),adate datetime default getdate()
		)
		--create index
		create nonclustered index nidx_1 
		on dbo.AIDC(adate asc)
		include(aperson,adept)
		--insert test date
		insert into AIDC 
		select 'a','a1','2010-01-03 12:45:11' union all
		select 'b','b1','2010-11-05 03:01:11' union all
		select 'c','c1','2010-10-13 17:15:11' union all
		select 'd','d1','2010-01-04 00:00:00' union all
		select 'e','e1','2010-01-03 21:00:11' union all 
		select 'f','f1','2010-01-04 10:11:20' 

 

查詢結果(列出幾個狀況)

image

1.由於datetimef欄位精準度的關係,所以查不到20100103當天資料。

2.雖然結果正確,但用到CONVERT函數將會導致無法使用Index。

3.between相當於>= and <= ,所以會包含2010-01-04 00:00:00.000這筆資料,但2010-01-04 10:11:20則不會。

4.該查詢符合SARG格式(沒使用函數),且結果也正確,所以我建議使用 >= and <來處理datetime類型欄位。