我有一个包含PeopleSoft登录信息的表格(Excel工作表,无论......),包含三列:登录时间,退出时间,花费的时间。
我的经理被要求使用它来提供整个数据集(白天)的并发登录的一分钟一分钟。
因此,表的SELECT就像这样:
SELECT LOGIN.Login, LOGIN.[Log out], LOGIN.[Time in]
FROM LOGIN;
输出如下:
Login Log out Time in
11/1/10 12:36 AM 11/1/10 12:42 AM 0:06
...
我需要的是:
Time Concurrent_Logins
11/1/10 12:36 AM 16
...
所以,这很复杂。有什么想法吗?
答案 0 :(得分:4)
您要做的是构建一个包含当天每分钟的表格。您可以通过多种方式执行此操作,只需搜索“计数表”等。
一旦你有一个包含所有会议记录的表格(以日期时间格式),它应该很简单。
在登录/注销之间的分钟加入您的登录表到分钟表,并为每分钟计数(*)。
答案 1 :(得分:1)
Derek的解决方案是要走的路。
http://www.ridgway.co.za/archive/2007/11/23/using-a-common-table-expression-cte-to-generate-a-date.aspx解释了一种生成时间表的方法
SET DATEFORMAT DMY
GO
DECLARE @STARTDATE DATETIME
DECLARE @ENDDATE DATETIME
SELECT @STARTDATE = '02/01/2011 01:00', @ENDDATE = '03/01/2011 01:00'
;
WITH DateRange(MyDateTime) AS
(
SELECT
@STARTDATE AS MyDateTime
UNION ALL
SELECT
DATEADD(minute, 1, MyDateTime) AS MyDateTime
FROM
DateRange
WHERE
MyDateTime < @ENDDATE
)
SELECT MyDateTime, ConcurrentConnections = COUNT(*)
FROM DateRange INNER JOIN [LOGIN] ON MyDateTime >= [LogIn] AND MyDateTime <= [Log Out]
OPTION (MaxRecursion 10000);
答案 2 :(得分:0)
要解决此问题,我首先会从数据集中获取最小和最大日期时间值。这将提供我们需要确定并发登录计数的时间范围。在获得时间范围之后,我会做一个循环来填充表中每分钟的范围以及该分钟的并发登录数。在填充表格之后,我将从中选择并发登录计数&gt; 0,这将是我的结果集。我使用SQL Server,您可能需要将一些语法转换为另一个DBMS。
-- To get the min and max of the time range
DECLARE @min datetime, @max datetime
SELECT @min = MIN(l.[Login]), @max = MAX(l.[Log out])
FROM [LOGIN] l
-- now make a table to how the minutes and the counts
CREATE TABLE #Result
(
[Time] datetime,
[count] int
)
-- now do a loop to fill each minute between @min and @max
DECLARE @currentTime datetime, @count int
SELECT @currentTime = @min, @count = 0
-- go from @min to @max
WHILE @currentTime < @max
BEGIN
-- get the count of concurrent logins for @currentTime
SELECT @count = COUNT(*)
FROM [LOGIN] l
WHERE @currentTime between l.[Login] and l.[Log out]
-- insert into our results table
INSERT #Result ([Time], [count]) VALUES (@currentTime, @count)
-- increment @currentTime for next pass
SELECT @currentTime = DATEADD(minute, 1, @currentTime)
END
-- select final result (where count > 0)
SELECT *
FROM #Result
WHERE [count] > 0
-- clean up our temp table
DROP TABLE #Result