Sql server 如何获取每小时loggedin用户总数的列表?

Sql server 如何获取每小时loggedin用户总数的列表?,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我正在尝试获取每小时登录的ID用户总数!但在某个特定的时间里,并没有用户的时候发生了什么,我想表明,并没有用户的时候是loggedin。 我认为要解决这个问题,我应该使用一个连接表,其中包含我筛选的两个日期之间的所有时间。 对这个问题有什么建议吗 SELECT FORMAT(chDate,'yyyy-MM-dd H:00:00') as cDate , count(ID) as nValue FROM myDB.myTable Where chDat

我正在尝试获取每小时登录的ID用户总数!但在某个特定的时间里,并没有用户的时候发生了什么,我想表明,并没有用户的时候是loggedin。 我认为要解决这个问题,我应该使用一个连接表,其中包含我筛选的两个日期之间的所有时间。 对这个问题有什么建议吗

SELECT 
      FORMAT(chDate,'yyyy-MM-dd H:00:00') as cDate ,
      count(ID) as nValue 
    FROM myDB.myTable 
    Where chDate > '2014-11-03 00:00:00' and chDate < '2014-11-03 4:00:00' 
    Group by FORMAT(chDate,'yyyy-MM-dd H:00:00')
我想要的结果

     cDate                nValue
2014-11-03 0:00:00           5
2014-11-03 1:00:00           0
2014-11-03 2:00:00           0
2014-11-03 3:00:00           8
试试这个

;WITH cte
     AS (SELECT convert(datetime,'2014-11-03 00:00:00') dates
         UNION ALL
         SELECT Dateadd(hh, 1, dates) dates
         FROM   cte
         WHERE  dates < dateadd(hh,-1,'2014-11-03 4:00:00'))
SELECT a.dates,
       Count(id)
FROM   cte a
       LEFT JOIN myDB.myTable b
              ON convert(date,a.dates) = convert(date,b.dates) and DATEPART(hour,a.dates) = DATEPART(hour,b.dates)
GROUP  BY a.dates 

“所有小时都加入表”可能是最好的解决方案。你可以使用两个表-日期表在很长一段时间内,我们使用30年和24个记录包含小时表。我同意你的看法,但我如何使用日期表,这是我正在寻找的。。你有什么例子吗?我想要一个两次约会之间的时间间隔列表。它与Sql server 2008 r2兼容吗?我得到了无效的对象名“temp”。@IamNumber5将其更改为您的tablename
;WITH cte
     AS (SELECT convert(datetime,'2014-11-03 00:00:00') dates
         UNION ALL
         SELECT Dateadd(hh, 1, dates) dates
         FROM   cte
         WHERE  dates < dateadd(hh,-1,'2014-11-03 4:00:00'))
SELECT a.dates,
       Count(id)
FROM   cte a
       LEFT JOIN myDB.myTable b
              ON convert(date,a.dates) = convert(date,b.dates) and DATEPART(hour,a.dates) = DATEPART(hour,b.dates)
GROUP  BY a.dates 
--example data
create table myTable (ID int, chDate datetime)
insert into myTable (ID, chDate) values (1, '2014-11-03 01:00'), (1, '2014-11-03 01:30'), (1, '2014-11-03 03:00'), (1, '2014-11-03 05:00')

SELECT DATEADD(hour, n.N, 0) as cDate
     , COUNT(t.ID) as nValue 
FROM dbo.Numbers n
     LEFT OUTER JOIN myTable t ON n.N = DATEDIFF(hour, 0, t.chDate)
WHERE n.N >= DATEDIFF(hour, 0, '2014-11-03 00:00:00') and n.N < DATEDIFF(hour, 0, '2014-11-03 4:00:00')
GROUP BY n.N
ORDER BY n.N
2014-11-03 00:00:00.000 0
2014-11-03 01:00:00.000 2
2014-11-03 02:00:00.000 0
2014-11-03 03:00:00.000 1