SQL返回日期范围,即使count为null

时间:2013-03-06 14:34:24

标签: sql date null

我在计算过去7天内的登录总数(UsersID)。我会计算此日期范围内的用户ID总数和按日期分组。我的问题是,如果没有为日期记录用户ID,则不显示日期。

所以我需要在没有登录的日期显示0。

我的代码是:

SET @StartDate = CONVERT(varchar(10),DATEADD(day,-7, GETDATE()), 101) +  ' 00:00.00';
SET @EndDate = DATEADD(day,7, @StartDate);

SELECT CONVERT(DATE, [DateTime]) as LoginDate, COUNT(UsersID) AS TotalForDay
FROM [STATS].[dbo].[UsersLogin]
WHERE [DateTime]>@StartDate 
AND [DateTime]<@EndDate
GROUP BY CONVERT(DATE, [DateTime])
ORDER BY LoginDate desc;

3 个答案:

答案 0 :(得分:5)

您需要一个包含日期值的单独表格,请尝试此操作

DECLARE @startdate datetime, @enddate datetime
SET @StartDate = CONVERT(varchar(10),DATEADD(day,-7, GETDATE()), 101) +  ' 00:00.00';
SET @EndDate = DATEADD(day,7, @StartDate);
;with cte as
(
    select @startdate DateValue
    union all
    select DateValue + 1
    from    cte   
    where   DateValue + 1 < @enddate
)


select a.DateValue as LoginDate,  COUNT(UsersID) AS TotalForDay
from cte a
LEFT outer join [STATS].[dbo].[UsersLogin] b 
on CONVERT(varchar(15), a.DateValue,101) = CONVERT(varchar(15), b.[DateTime],101)
group by a.DateValue
order by a.DateValue desc

按小时分组:

DECLARE @startdate datetime, @enddate datetime
SET @StartDate = CONVERT(varchar(10),DATEADD(day,-7, GETDATE()), 101) +  ' 00:00.00';
SET @EndDate = DATEADD(day,7, @StartDate);
;with cte as
(
    select @startdate DateValue
    union all
    select DATEADD (hh,1,DateValue)
    from    cte   
    where   DATEADD (hh,1,DateValue) < @enddate
)


select a.DateValue as LoginDate,  COUNT(UsersID) AS TotalForDay
from cte a
LEFT outer join [STATS].[dbo].[UsersLogin] b 
on CONVERT(varchar(15), a.DateValue,101) = CONVERT(varchar(15), b.[DateTime],101)
group by a.DateValue
order by a.DateValue desc
OPTION (MAXRECURSION 0) 

答案 1 :(得分:0)

您需要针对日历关系在日期上执行左连接,无论是静态地实现为表还是动态地实现为子查询。

SET @StartDate = CONVERT(varchar(10),DATEADD(day,-7, GETDATE()), 101) +  ' 00:00.00';
SET @EndDate = DATEADD(day,7, @StartDate);

SELECT C.Date, COUNT(UsersID) AS TotalForDay
FROM Calendar as C
LEFT JOIN [STATS].[dbo].[UsersLogin] as U on C.Date = CONVERT(DATE, [DateTime])       
WHERE [DateTime]>@StartDate 
AND [DateTime]<@EndDate
GROUP BY CONVERT(DATE, [DateTime])
ORDER BY LoginDate desc;

答案 2 :(得分:0)

如果需要比使用此更简单。 创建一个临时表变量,并从头到尾添加日期:

Declare @temp_Dates Table
(
  TempDate datetime
)

While (@StartDate<@EndDate)
Begin
  Insert Into @temp_Dates Select @EndDate
  Set @EndDate=DATEADD(DAY,-1,@EndDate)
End

之后,将您的桌子与上面的一个连接:

SELECT Cast(Convert(varchar(20),td.TempDate,101) as DateTime) as LoginDate,     COUNT(UsersID) AS TotalForDay
FROM @temp_Dates td
Left Join  UsersLogin ul On Cast(Convert(varchar(20),ul.DateTime,101) as     DateTime)=Cast(Convert(varchar(20),td.TempDate,101) as DateTime)
GROUP BY Cast(Convert(varchar(20),td.TempDate,101) as DateTime)
ORDER BY LoginDate desc

您将获得所需的结果。