Как получить выборку с 6 до 6 вечера


2 0

Допустим, что нужно получить количество записей из таблицы, сгруппированных по дням. Такое решается достаточно просто, нужно только обрезать время и сгруппировать строки:

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 скорей всего не будет использовать индекс при поиске по дате. Этот сервер сразу же отказывается от индексов, если происходит любая манипуляция над искомым полем, а тут изменяется время


Понравилось? Кликни Лайк, чтобы я знал, какой контент более интересен читателям. Заметку пока еще никто не лайкал и ты можешь быть первым


Комментарии

Kastor

23 Марта 2014


Недостаток такого метода только в том, что SQL Server скорей всего не будет использовать индекс при поиске по дате. Этот сервер сразу же отказывается от индексов, если происходит любая манипуляция над искомым полем, а тут изменяется время

Если в таблице есть таки индекс по колонке с датой, то в приведенном запросе он не будет использоваться, скорее всего потому, что к значению из колонки применяется функция. Вот не могу ручаться, как оно работает в MS SQL, но у Oracle именно так. И в Oracle, если бы мне часто приходилось делать подобные запросы, то нужно было бы построить индекс не только на колонку с датой, а индекс на функцию к этой колонке. Думаю в MS SQL тоже так.


Михаил Фленов

23 Марта 2014

Ну об этом я как раз и сказал, что индекс использоваться скорей всего не будет. Можно построить исчисляемое поле и сделать индекс по нему.


Добавить Комментарий

Еще что-нибудь

Хотите найти еще что-то интересное почитать? Можно попробовать отфильтровать заметки на блоге по категориям.

О блоге

Программист, автор нескольких книг серии глазами хакера и просто блогер. Интересуюсь безопасностью, хотя хакером себя не считаю

Обратная связь

Без проблем вступаю в неразборчивые разговоры по e-mail. Стараюсь отвечать на письма всех читателей вне зависимости от страны проживания, вероисповедания, на русском или английском языке.

Пишите мне