Допустим, что нужно получить количество записей из таблицы, сгруппированных по дням. Такое решается достаточно просто, нужно только обрезать время и сгруппировать строки:
select convert(varchar(10), StartDate, 102) as StartDate, count(*) from TableName group by convert(varchar(10), StartDate, 102) order by 1 desc
А что, если нужно получить количество записей за каждый день, только с 6 до 6 вечара? Недавно увидел запрос, в котором просто проверялось время условием - если время больше 6 вечера сегодны и меньше 6 вечера застра, то сумировать строки. Хорошо, что нужно было показывать только за последние 5 дней и подобный запрос состоял только из 5 условий.
На много красией и проще проблема решается простым смещением времени на 6 часов:
select convert(varchar(10), dateadd(hour, -18, StartDate), 102) + ' 18:00:00' as StartDate, count(*) from TableName group by convert(varchar(10), dateadd(hour, -18, StartDate), 102) + ' 18:00:00' order by 1 desc
Недостаток такого метода только в том, что SQL Server скорей всего не будет использовать индекс при поиске по дате. Этот сервер сразу же отказывается от индексов, если происходит любая манипуляция над искомым полем, а тут изменяется время
Понравилось? Кликни Лайк, чтобы я знал, какой контент более интересен читателям. Заметку пока еще никто не лайкал и ты можешь быть первым
Ну об этом я как раз и сказал, что индекс использоваться скорей всего не будет. Можно построить исчисляемое поле и сделать индекс по нему.
Хотите найти еще что-то интересное почитать? Можно попробовать отфильтровать заметки на блоге по категориям.