For SQL2005 +:
Note: Select Convert(DateTime, Convert(VarChar, DateTimeColumn, 12)) <operator> <const> does not work SARG ! So, if you have an index on a DateTimeColumn , then SQL Server cannot search ( Index Seek ) in this column. Instead, SQL Server will use Index Scan , Clustered Index Scan or Table Scan .
If you want to filter rows in a DATETIME column, you can use the predicates DateTimeColumn >= RangeStart AND DateTimeColumn < RangeEnd or DateTimeColumn BETWEEN RangeStart AND RangeEnd .
How can I generate RangeStart and RangeEnd ?
DECLARE @SelectedDate DATETIME; SET @SelectedDate='2013-06-11 15:06:27.000'; SELECT DATEADD(DAY,DATEDIFF(DAY,0,@SelectedDate),0) AS Start, DATEADD(DAY,DATEDIFF(DAY,0,@SelectedDate)+1,0) AS [End 1], DATEADD(MILLISECOND,-3,DATEADD(DAY,DATEDIFF(DAY,0,@SelectedDate)+1,0)) AS [End 2]
Note 2 For a DATETIME column, the last millisecond can be one of these {0,3,7} (see BOL ).
Results:
Start End 1 End 2 ----------------------- ----------------------- ----------------------- 2013-06-11 00:00:00.000 2013-06-12 00:00:00.000 2013-06-11 23:59:59.997
Example # 1:
... WHERE h.OrderDate>=DATEADD(DAY,DATEDIFF(DAY,0,@SelectedDate),0) AND h.OrderDate<DATEADD(DAY,DATEDIFF(DAY,0,@SelectedDate)+1,0)
Example # 2:
... WHERE h.OrderDate>=DATEADD(DAY,DATEDIFF(DAY,0,@SelectedDate),0) AND h.OrderDate<=DATEADD(MILLISECOND,-3,DATEADD(DAY,DATEDIFF(DAY,0,@SelectedDate)+1,0))
Example # 3:
... WHERE h.OrderDate BETWEEN DATEADD(DAY,DATEDIFF(DAY,0,@SelectedDate),0) AND DATEADD(MILLISECOND,-3,DATEADD(DAY,DATEDIFF(DAY,0,@SelectedDate)+1,0))