我在计算UsersID过去7天内的登录总数().我会计算此日期范围内的用户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;
Run Code Online (Sandbox Code Playgroud)
您需要一个包含日期值的单独表,请尝试此操作
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
Run Code Online (Sandbox Code Playgroud)
按小时分组:
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)
Run Code Online (Sandbox Code Playgroud)