用于DATERANGE的SQL WITH CLAUSE选择

时间:2014-02-18 02:33:34

标签: sql count date-range

我不确定这是否正确,任何人都可以指导我。我试图在1个月的时间内检索我的访客登录次数,但是有一些空的计数,没有人登录。所以结果就像

DATE        |        COUNT
2013-12-01            2
2013-12-05            4

但我想要的是

DATE        |        COUNT
2013-12-01            2
2013-12-02            0
2013-12-03            0
2013-12-04            0
2013-12-05            4

所以我发现在这个网站上是使用递归日期生成然后逻辑上我想到选择日期的最终结果并加入我的成员选择。

DECLARE @startDate DATE
DECLARE @endDate DATE

SET @startDate = '2013-12-01'
SET @endDate = '2014-01-01'
;
WITH dates(Date) AS 
(
    SELECT @startdate as Date
    UNION ALL
    SELECT DATEADD(d,1,[Date])
    FROM dates 
    WHERE DATE < @enddate
)

SELECT dates.Date, COUNT(Guest.Identity)
FROM [Membership].[dbo].[Guest] 
right join 
dates 
on
Dates.Date = Guest.SignInDateTime and 
Guest.SignInDateTime >= @startdate and
Guest.SignInDateTime < @enddate and
DATEPART(hh, Guest.SignInDateTime) >= 10 and 
DATEPART(hh, Guest.SignInDateTime) <= 13
GROUP BY DATEPART(d, dates.Date) 
ORDER BY dates.Date asc

但是我遇到像date.Date这样的错误在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。 任何人都可以指导我或有更好的方法吗? 提前致谢

2 个答案:

答案 0 :(得分:0)

group by更改为:

GROUP BY dates.Date

您可能不希望按月份分组。完整日期更有用。

答案 1 :(得分:0)

您按DATEPART(d, dates.Date)进行分组,但选择dates.date。我想你想要这样的东西:

SELECT DATEPART(d, dates.Date), COUNT(Guest.Identity)
FROM [Membership].[dbo].[Guest] 
    right join dates on
        Dates.Date = Guest.SignInDateTime and 
        Guest.SignInDateTime >= @startdate and
        Guest.SignInDateTime < @enddate and
        DATEPART(hh, Guest.SignInDateTime) >= 10 and 
        DATEPART(hh, Guest.SignInDateTime) <= 13
GROUP BY DATEPART(d, dates.Date) 
ORDER BY DATEPART(d, dates.Date) asc

重新调用sql,假设SignInDateTime包含时间戳,那么此查询可能不会返回您想要的结果,因为Dates.Date只是一个日期。也许你实际上只想加入约会(正如戈登指出的那样,按dates.date分组):

SELECT dates.Date, COUNT(Guest.Identity)
FROM Dates left join [Membership].[dbo].[Guest] on
        Dates.Date = cast(Guest.SignInDateTime as date) and 
        Guest.SignInDateTime >= @startdate and
        Guest.SignInDateTime < @enddate and
        DATEPART(hh, Guest.SignInDateTime) >= 10 and 
        DATEPART(hh, Guest.SignInDateTime) <= 13
GROUP BY dates.Date
ORDER BY dates.Date asc