Что действительно 'объясняет', говорят? (выполненный ОБЪЯСНЯЮТ ВЫБОР * ОТ transactionlist, где дата (TranDateTime) = '2008-08-17')
, Если это не использует Ваш индекс из-за даты () функция, запрос диапазона, должен работать быстро:
ВЫБОР * ОТ transactionlist, где TranDateTime> = '2008-08-17' И TranDateTime < '2008-08-18'
Использование inline view:
SELECT DATEPART(hh, x.visitdate),
AVG(x.num)
FROM (SELECT t.visitdate,
COUNT(*) 'num'
FROM CUSTOMERLOG t
WHERE t.visitdate BETWEEN 'Jan 1 2009' AND 'Aug 1 2009'
GROUP BY t.visitdate) x
GROUP BY DATEPART(hh, x.visitdate)
Использование эквивалента CTE (SQL Server 2005+):
WITH visits AS (
SELECT t.visitdate,
COUNT(*) 'num'
FROM CUSTOMERLOG t
WHERE t.visitdate BETWEEN 'Jan 1 2009' AND 'Aug 1 2009'
GROUP BY t.visitdate)
SELECT DATEPART(hh, x.visitdate),
AVG(x.num)
FROM visits x
GROUP BY DATEPART(hh, x.visitdate)
Количество дней известно и равно РАЗНДАТ (день, ПРЕОБРАЗОВАТЬ (ДАТАВРЕМЯ, '2009.01.01', 120), ПРЕОБРАЗОВАТЬ (ДАТАВРЕМЯ, '2009.09.01' , 120))
.
Вы должны вычислить сумму и разделить ее на количество дней в выбранном диапазоне:
SELECT
DATEPART(hh, VisitDate),
CAST(COUNT(*) AS FLOAT) / DATEDIFF(day,CONVERT(DATETIME,'2009.01.01',120),CONVERT(DATETIME,'2009.09.01',120))
FROM CustomerLog
WHERE
(VisitDate >= CONVERT(DATETIME,'2009.01.01',120)) AND
(VisitDate < CONVERT(DATETIME,'2009.09.01',120))
GROUP BY DATEPART(hh, VisitDate)
CAST (COUNT (*) AS FLOAT)
, чтобы получить более точный результат, но вы можете оставить только COUNT (*)
и иметь целочисленный результат.
Если вы используете параметры, это будет:
SELECT
DATEPART(hh, VisitDate),
CAST(COUNT(*) AS FLOAT) / DATEDIFF(day,@beginningDate,@endDate)
FROM CustomerLog
WHERE
(VisitDate >= @beginningDate) AND
(VisitDate < @endDate)
GROUP BY DATEPART(hh, VisitDate)
Если вы хотите получить результаты за январь, вы должны использовать @beginningDate = '2009.01.01', @endDate = '2009.02.01' .