计算开始和结束时间之间每小时的数字

我有一个考勤pipe理系统,logging每次考勤的开始和结束时间。 我可以通过从结束时间开始计算开始时间来轻松计算停留时间。

数据的一个例子是这样的: –

VisitUID | AttendeeID | Start_time | End_time 0 ----- 123 ----- 01/01/2015 09:15 ----- 01/01/2015 17:15 1 ----- 456 ----- 01/01/2015 10:45 ----- 01/01/2015 16:30 2 ----- 753 ----- 01/01/2015 08:05 ----- 01/01/2015 17:45 3 ----- 975 ----- 01/01/2015 07:15 ----- 01/01/2015 15:05 4 ----- 864 ----- 01/01/2015 15:55 ----- 01/01/2015 16:25 5 ----- 246 ----- 01/01/2015 16:00 ----- 01/01/2015 17:35 6 ----- 357 ----- 01/01/2015 11:10 ----- 01/01/2015 14:55 

所以计数会是这样的(请原谅,如果我错了!): –

 07 - 1 08 - 2 09 - 3 10 - 4 11 - 5 12 - 5 13 - 5 14 - 5 15 - 5 16 - 5 17 - 3 

我想知道的方法是统计每个小时有多less人在现场了解数字?

系统是SQL,开始和结束是date时间值,所以在SQL甚至Excel中计算这个值的方法将是惊人的。

如果您的数据已经在SQL Server数据库中,则无需将其导出到Excel中。 只需要几行SQL即可完成。 如果你更喜欢Excel,你也可以select上面或下面的选项。

您首先需要一个具有所有可能小时数的表格: values(7), (8), ...当表格小时位于开始date和结束date之间时,可以将其与您的数据结合起来。

您的数据:

 declare @date table(VisitUID int, AttendeeID int, Start_time datetime, End_time datetime) Insert Into @date(VisitUID, AttendeeID, Start_time, End_time) values (0, 123, '01/01/2015 09:15', '01/01/2015 17:15') , (1, 456, '01/01/2015 10:45', '01/01/2015 16:30') , (2, 753, '01/01/2015 08:05', '01/01/2015 17:45') , (3, 975, '01/01/2015 07:15', '01/01/2015 15:05') , (4, 864, '01/01/2015 15:55', '01/01/2015 16:25') , (5, 246, '01/01/2015 16:00', '01/01/2015 17:35') , (6, 357, '01/01/2015 11:10', '01/01/2015 14:55') 

查询:

 Select hn, COUNT(*) From (values(7), (8), (9), (10), (11), (12), (13), (14), (15), (16), (17), (18)) as h(n) Inner Join @date d on hn >= DATEPART(hour, d.Start_time) and hn <= DATEPART(hour, d.End_time)+1 Group by hn 

如果您需要0到7或18到0的数据,只需将它们添加到列表中: values(6), (7), (8)...(18)...

看来你的计算是正确的。 我有相同的输出。

输出:

 Hour Count 7 1 8 2 9 3 10 4 11 5 12 5 13 5 14 5 15 5 16 5 17 3 

Excel中。 另一个downvote 🙂

在这里输入图像说明

F3中的公式复制到适合的地方是:

 =--AND(HOUR($C3)<G$2,HOUR($D3)>=F$2) 

在F1中复制的公式是:

  =SUM(F3:F1000) 

在这里输入图像描述

在这幅图中,下面的单元格包含以下公式/常量…

F3 … 01.01.2015 00:00:00

G3 … =F3+TIME(1;0;0) …将此权限复制到AC3

F4 … =IF(AND(F$3>=$D4;F$3<$E4);1;0) …复制这个向右/向下直到AC10

F12 … =SUM(F4:F11) …复制这个权限直到AC12

这里的核心是检查用户login期是否包含你想要testing的时间点(例如,test_time> = start_time和test_time <end_time)…从而你可以得到哲学的是> =和<或>和<=

现在…如果您需要日常活动曲线,而不是在标题中对date进行硬编码,则只能在标题中包含时间,并将其与用户login/date的时间部分进行比较(如in = date-INTdate)…)

您可以在以下方面使用UNPIVOT

QUERY

 ;with cte as ( select DATEPART(hh,Start_time) StartTime , DATEPART(hh,End_time) EndTime , CASE WHEN 7 BETWEEN DATEPART(hh,Start_time) AND DATEPART(hh,End_time) THEN 1 ELSE 0 END AS [7] , CASE WHEN 8 BETWEEN DATEPART(hh,Start_time) AND DATEPART(hh,End_time) THEN 1 ELSE 0 END AS [8] , CASE WHEN 9 BETWEEN DATEPART(hh,Start_time) AND DATEPART(hh,End_time) THEN 1 ELSE 0 END AS [9] , CASE WHEN 10 BETWEEN DATEPART(hh,Start_time) AND DATEPART(hh,End_time) THEN 1 ELSE 0 END AS [10] , CASE WHEN 11 BETWEEN DATEPART(hh,Start_time) AND DATEPART(hh,End_time) THEN 1 ELSE 0 END AS [11] , CASE WHEN 12 BETWEEN DATEPART(hh,Start_time) AND DATEPART(hh,End_time) THEN 1 ELSE 0 END AS [12] , CASE WHEN 13 BETWEEN DATEPART(hh,Start_time) AND DATEPART(hh,End_time) THEN 1 ELSE 0 END AS [13] , CASE WHEN 14 BETWEEN DATEPART(hh,Start_time) AND DATEPART(hh,End_time) THEN 1 ELSE 0 END AS [14] , CASE WHEN 15 BETWEEN DATEPART(hh,Start_time) AND DATEPART(hh,End_time) THEN 1 ELSE 0 END AS [15] , CASE WHEN 16 BETWEEN DATEPART(hh,Start_time) AND DATEPART(hh,End_time) THEN 1 ELSE 0 END AS [16] , CASE WHEN 17 BETWEEN DATEPART(hh,Start_time) AND DATEPART(hh,End_time) THEN 1 ELSE 0 END AS [17] from #test ) select StartTime1 StartTime, sum(Cnt) Counter from( select StartTime,[7],[8],[9],[10],[11],[12],[13],[14],[15],[16],[17] from cte ) p UNPIVOT ( Cnt FOR StartTime1 IN ([7],[8],[9],[10],[11],[12],[13],[14],[15],[16],[17]) )AS unpvt group by StartTime1 order by CAST(StartTIme1 AS INT) 

样本数据

 create table #test ( VisitUID INT, AttendeeID INT, Start_time DATETIME, End_time DATETIME, ) insert into #test values (0, 123,'01/01/2015 09:15','01/01/2015 17:15'), (1, 456,'01/01/2015 10:45','01/01/2015 16:30'), (2, 753,'01/01/2015 08:05','01/01/2015 17:45'), (3, 975,'01/01/2015 07:15','01/01/2015 15:05'), (4, 864,'01/01/2015 15:55','01/01/2015 16:25'), (5, 246,'01/01/2015 16:00','01/01/2015 17:35'), (6, 357,'01/01/2015 11:10','01/01/2015 14:55') 

OUTPUT

 StartTime Counter 7 1 8 2 9 3 10 4 11 5 12 5 13 5 14 5 15 5 16 5 17 3 

…甚至Excel将是惊人的。

假设您的数据在列A:D中,请select11个连续的垂直单元格,然后将以下内容粘贴到配方栏中并使用CONTROL-ENTER进行确认:

 =SUMPRODUCT((ROWS($1:1)+6>=HOUR(C$2:C$99))*(ROWS($1:1)+6<=HOUR(D$2:D$99))) 

注意:如果考勤数据超出第99行,则适当增加公式中的99。