Sql 获取每个用户每天的小时数

Posted

技术标签:

【中文标题】Sql 获取每个用户每天的小时数【英文标题】:Sql to get number of hours per user per day 【发布时间】:2019-05-11 15:49:16 【问题描述】:

表格“日志”具有以下列:

SystemName
User
Datetime - it's a timestamp
Status - has the values Start or Stop. 

我需要编写一个查询,它会给我: 每个用户每天在 X 系统上花费的小时数。

请看下面的示例数据:

X, Amit, 05/01/2019 08:45:00, Start
X, Amit, 05/03/2019 13:25:00, Stop
X, Dave, 05/01/2019 09:10:35, Start
X, Dave, 05/01/2019 17:35:42, Stop

输出:

Amit,05/01/2019, 15h
Amit,05/02/2019, 24h
Amit,05/03/2019, 9h
Dave,05/01/2019, 8h

到目前为止我的方法: 我在想我可以使用领先或滞后来获得同一行的连续时间。但是对于跨越多天的用户 Amit。也可能有一个用户在同一天多次启动和停止。即使我这样做了,我怎么能在该范围内为日期生成小时数。你能帮帮我吗?

【问题讨论】:

想法是枚举范围内的所有小时(这是特定于 DBMS),按日期分组。 【参考方案1】:

这应该可行。仅当用户在一天内同时存在开始和停止状态时,您才会获得花费的小时数。

SELECT SystemName,[user],
CONVERT(varchar, CAST(Datetime AS DATETIME), 1) Datetime,
DATEDIFF
(
    HH,
    MAX(CASE WHEN Ststus = 'Start' THEN [Datetime] ELSE NULL END ),
    MAX(CASE WHEN Ststus = 'Stop' THEN Datetime ELSE NULL END )
)HourSpent
FROM your_table A
GROUP BY SystemName,[User],
CONVERT(varchar, CAST(Datetime AS DATETIME), 1)

【讨论】:

在Amit的例子中,起点和终点跨越2天。我们如何生成 05/02/2019 的小时数?您能否分享一个指向您在此处提出的解决方案的 sqlfiddle 链接? @AnilKulkarni 我在详细信息中提到,此解决方案仅在同一天启动和停止可用时才有效。在示例输出中,OP 还显示了每天花费的时间,我相应地准备了脚本。【参考方案2】:

由于输出由每个用户 + 天一行组成,因此您需要将数据加入日期日历表。

您需要一种方法来提取给定用户的开始和停止时间戳对,将其加入日历表,然后计算当天开始和停止时间之间的小时数。 (小时数可以使用User Defined Function。

这很复杂。坦率地说,我宁愿编写一个 Python 程序来解析数据,而不是通过 SQL 来完成它。这很简单:

读取起始行 读取结束行 循环几天,每天输出小时数(在 Python 中很简单)

有时最好的锤子是扳手。 (翻译:有时不同的工具会更好。)

【讨论】:

以上是关于Sql 获取每个用户每天的小时数的主要内容,如果未能解决你的问题,请参考以下文章

每个用户每天的 SQL 第一个和最后一个时间戳

SQL:如何获取每个数据库或每小时或...的执行查询数?

每天在 Mondrian MDX 中获取用户数量

Laravel 每天按奇数小时对数据进行分组

MySQL获取每天的最早记录

django queryset 获取组的平均值