2014-11-04 48 views
0

我想获得每小时登录的“ID用户”的总数!但是在某些时候发生的情况是没有用户在特定小时内登录,并且我想显示那个小时内有零个用户登录。 我认为要解决这个问题,我应该使用连接表与所有的时间之间的这两个日期,我过滤。 对此问题的任何建议?如何获得每小时登录用户总数的列表?

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') 

的resault我

 cDate     nValue 
2014-11-03 0:00:00   5 
2014-11-03 3:00:00   8 

的resault我想

 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 
+0

“连接表的所有时间'可能是最好的解决方案。您可以使用两个表格 - 日期表格(长期以来,我们使用30年)和包含小时表格的24个记录。 – Arvo 2014-11-04 09:10:44

+0

我同意你的意见,但我怎样才能使用日期表,这是我正在寻找..你有任何例子吗?我想要两个日期之间的小时的列表。 – IamNumber5 2014-11-04 09:21:38

回答

1

试试这个。

;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 
+0

什么是#temp它与Sql server 2008 r2兼容?我得到了无效的对象名称'#temp'。 – IamNumber5 2014-11-04 09:26:23

+0

@ IamNumber5将其更改为您的餐桌名称 – 2014-11-04 09:27:57

+0

它适合我!谢谢。 – IamNumber5 2014-11-04 10:44:55

0
--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 

注意,这里使用一个numbers table但日期表将工作一样好(更好,甚至)

结果举例:

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