[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'
查詢結果(列出幾個狀況)
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類型欄位。