В этом случае самый простой код и самый быстрый код, вероятно, будут сильно различаться и, возможно, будут зависеть от размера вашего набора данных.
Я подозреваю, что самым быстрым будет присоединиться к календарю и фильтровать,В этом случае я создаю календарь перед тем, как начать, но я предлагаю постоянный ...
CREATE TABLE #calendar (
date AS DATETIME
)
INSERT INTO #calendar SELECT '2011-12-31' UNION ALL SELECT '2012-01-01'
UNION ALL SELECT '2012-01-02' UNION ALL SELECT '2012-01-03'
UNION ALL SELECT '2012-01-04' UNION ALL SELECT '2012-01-05'
SELECT
calendar.date,
COUNT(*)
FROM
yourTable
INNER JOIN
#calendar AS calendar
ON yourTable.DateTimeField >= calendar.date + @minTime
AND yourTable.DateTimeField < calendar.date + @maxTime
WHERE
calendar.date >= @startDate
AND calendar.date <= @endDate
GROUP BY
calendar.date
Это должно дать наиболее удобный для индекса запрос, и поэтому для любого разумного размера данных будет оченьэффективный.
ПРИМЕЧАНИЕ:
Разделы calendar.date + @Time
могут отличаться.Вы только что сказали MS SQL Server, так что это было бы больше похоже на ...
ON yourTable.DateTimeField >= DATEADD(hour, @minHour, calendar.date)
AND yourTable.DateTimeField < DATEADD(hour, @maxHour, calendar.date)