Я видел немало трюков для преобразования DATETIME в "просто время". Фактически, где я работаю, довольно много времени было потрачено на поиск самого быстрого. Кажется, что люди забывают, что «самый короткий код» не всегда самый быстрый и часто включает скрытые преобразования типов. Самое быстрое, что мы придумали, это ...
DATEADD (ДЕНЬ, DATEDIFF (МИНУТА, 0,), 0)
Причина, по которой я упоминаю, состоит в том, что, когда у вас есть компонент времени, все становится проще и позволяет легче вносить изменения в код для незначительно различных потребностей.
DECLARE
@start_date DATETIME,
@end_date DATETIME,
@chosen_time DATETIME
SELECT
@start_date = '2009 Jan 05 00:00',
@end_date = '2009 Jan 12 00:00',
@chosen_time = '1900 Jan 01 17:30' -- '1900 Jan 01' is day 0
SELECT
<whatever>
FROM
WideHistory
WHERE
[WideHistory].DateTime >= @start_date
AND [WideHistory].DateTime < @end_date
AND DATEADD(DAY, DATEDIFF(MINUTE, 0, [WideHistory].DateTime), 0) = @chosen_time
Можно легко адаптировать это к нескольким ключевым временам дня, или диапазону времени, и т. Д., И т. Д. *
EDIT:
Как уже упоминалось в комментариях к этому ответу, изменение структуры базы данных также выиграет здесь. Наличие поля DATE, а также поля TIME. Часто лишнее, но в этом случае может быть полезным.