我從來不喜歡使用系統表創建虛擬記錄來加入,但這是一種非常普遍的方法。
我拿了Aaron Bertrand的回答,並改變了公共表格表達式(CTE)來使用遞歸的表達式。它更快,因爲它不必擊中表來執行查詢。不是說以前的版本反正慢。
您需要指定「OPTION(MAXRECURSION 0);」否則會限制返回到默認值(100)的行數。值爲0將返回無限的行。
DECLARE @min SMALLDATETIME, @max SMALLDATETIME;
--SELECT @min = MIN(h_time), @max = MAX(h_time)
-- FROM dbo.hits
SELECT @min = '20120101', @max = '20121231';
WITH recursedate(each_date, date_index) AS
(
SELECT @min, 0
UNION ALL
SELECT DATEADD(DAY,date_index+1,@min), date_index+1
FROM recursedate
WHERE DATEADD(DAY,date_index+1,@min) <= @max
)
SELECT recursedate.each_date, [count] = COUNT(h.h_time)
FROM recursedate
LEFT OUTER JOIN dbo.hits AS h
ON --CONVERT(SMALLDATETIME,h.h_time) = recursedate.dates
h.h_time >= recursedate.each_date
AND h.h_time < DATEADD(DAY, 1, recursedate.each_date)
-- AND --WHERE clause against hits?
GROUP BY recursedate.each_date
OPTION (MAXRECURSION 0); -- The default is 100 so you'll only get 100 dates, 0 is unlimited.
什麼版本的SQL Server? –
嘿諾拉,感謝您的鏈接。我想我在搜索時沒有把它說得對。 :) – ZachRabbit