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 获取每个用户每天的小时数的主要内容,如果未能解决你的问题,请参考以下文章