Select * from tbl
where ts between
convert(datetime,convert(varchar,ts, 101)) + convert(datetime,'9:30 am')
And Convert(datetime,convert(varchar,ts,101)) + convert(datetime,'5:30 pm')
Это, я считаю, будет использовать индекс. Я не могу проверить, я выкладываю это с ipod
[РЕДАКТИРОВАТЬ с моего компьютера]
create function dbo.DaysTime(@date as datetime, @time datetime)
returns datetime
as
begin
/* datediff approach on scraping the
time part of datetime: inspired by Russ Cam */
return dateadd(d, datediff(d, 0, @d), 0)/*the date's day*/ + @time
end
select * from tbl where ts
between dbo.DaysTime(ts, '9:30 AM') and dbo.DaysTime(ts, '5:30 PM')
При этом по-прежнему будет использоваться индекс, поскольку мы не поместили выражение слева от условия where.