如何在SQL中获取与给定时间段重叠的记录计数?

时间:2011-05-09 13:47:18

标签: sql

我有很多用户(数十万),我想计算他们所连接的服务器的峰值使用情况并与之互动。

我使用 UserID BeginDT ,会话开始时的DateTime和 EndDT 的日期时间来维护一个非常简单的表格结束。

我想知道一天中的每个小时,用户连接了多少。我也可能想要一天一分钟。

我无法在该表中添加新字段来计算在给定时间连接的用户数,因为我无法控制填充表的应用程序。

我需要生成一个数据集,其中包含在一天中的给定时间连接的用户数量,以便绘制图表。

3 个答案:

答案 0 :(得分:1)

我不完全确定你在寻找什么。下面将为您提供计算 BY HOUR 的细目,这不会分开不同的日期。这使用tally table,如果您需要相关信息,请参阅链接。现在,如果用户在10:59登录,它们仍将在10:00时计算。

CREATE TABLE #LogTimes
(
    userId int,
    starttime DATETIME,
    endtime DATETIME
)

 SELECT TOP 24
        IDENTITY(INT,1,1) AS N
   INTO dbo.Tally
   FROM Master.dbo.SysColumns sc1

INSERT INTO #LogTimes
SELECT 1, GETDATE(), DATEADD(HH, 3, GETDATE()) UNION ALL
SELECT 2, DATEADD(DD, 1, GETDATE()), GETDATE() UNION ALL
SELECT 3, GETDATE(), DATEADD(HH, 5, GETDATE()) UNION ALL
SELECT 4, GETDATE(), DATEADD(HH, 7, GETDATE()) UNION ALL
SELECT 5, GETDATE(), DATEADD(HH, 9, GETDATE())

SELECT N, COUNT(*) FROM #LogTimes LT
    JOIN Tally T ON DATEPART(Hour, startTime) <= T.N AND DATEPART(hour, endtime) >= T.N
    GROUP BY N
    ORDER BY N ASC  

结果:

10  5
11  4
12  4
13  4
14  3
15  3
16  2
17  2
18  1
19  1

此外,如果用户跨越几天,这将无法正常工作。需要添加此逻辑。

答案 1 :(得分:0)

你查询数据库并选择计数UserID的那些有BeginDT&gt; =你的开始时间和EndDT&lt; =你的开始时间+ 1(小时/分钟/秒/天),最好是使用时间戳它更快

这样的东西

SELECT count(UserID) FROM users Where BeginDT>="starttime" AND EndDT<="startime+timeincrement"

注意:这是仅针对特定小时(日等)的1个查询 如果你想获得一个具有峰值的时期,它的变化非常大,你可能需要多次选择。

答案 2 :(得分:0)

如果您有LINQ,可以这样做:

var start = new DateTime(2008, 1, 1);
var end = new DateTime(2008, 1, 2);
var q1 = TblSessions.Where (s => s.BeginDT >= start && s.EndDT <= end).ToList();
var q2 = from r in Enumerable.Range(0, (int)(end - start).TotalHours).Select (e => start.AddHours(e))           
         select new 
         {
            Time = r,
            Count = q1.Count (x => r >= x.BeginDT && r <= x.EndDT)
         };

(如果您没有使用相同查询的Linq2Sql,您可以填写并查询数据集)