我正在计算时间。
这里有一个例子:我有开放会话和会话的时间
我想计算一天的连接时间。这里的问题是断开时间是第二天 (在图片上)对于2017-01-19的第一线时间连接将是从早上7:49到午夜。 2017-01-20的时间连接将是从中午到早上00:39 和从上午8:48到中午。 我不知道如何从前一天检索时间。
我开始做类似的事情,但我并不满意:
Sessionid sessionOn SessionOff Time(hour) Time+1
----------- ----------------------- ----------------------- ----------- -------
1 2017-01-19 07:49:42.600 2017-01-20 00:39:31.247 16 0.39
2 2017-01-20 07:56:01.030 2017-01-21 00:36:36.863 16 0.36
然后将时间+ 1添加到第二天的时间(可能有交易)。我正在使用SQL服务器。
你知道我怎么能以更干净的方式做到这一点?
预期结果
Sessionid Time of connexion (hour)
----------- -------
1 16h11
2 16h43
答案 0 :(得分:0)
这里有一些东西让你入门:
declare @x table(sessionOn datetime, sessionOff datetime)
insert into @x values
('2017-01-19 07:49:42.600','2017-01-20 00:39:31.247'),
('2017-01-20 07:56:01.030','2017-01-21 00:36:36.093'),
('2017-01-23 08:10:03.937','2017-01-24 00:47:10.893')
select C1, floor(C2/3600) [hour], floor(C2 % 3600 / 60) [minute], FLOOR(C2 % 60) [second] from (
select ISNULL(A.DayOfSession, B.DayOfSession) [C1],
ISNULL(A.DurationInSec, 0) + ISNULL(B.DurationInSec, 0) [C2]
from
(select cast(sessionOn as date) as DayOfSession, DATEDIFF(second, sessionOn, cast(sessionOff as date)) DurationInSec from @x) as A
full join
(select cast(sessionOff as date) as DayOfSession, DATEDIFF(second, cast(sessionOff as date), sessionOff) DurationInSec from @x) as B
on A.DayOfSession = B.DayOfSession
) as a
这里有一点解释:
第一个子查询计算从SessionOn
到午夜(以秒为单位)的持续时间;
第二个查询计算从午夜到SessionOff
的持续时间。
此持续时间在不同的子查询中计算,并为其分配了正确的日期(没有时间)。
现在,有基于日期的简单连接:)
此处的结果集:
关于OP对本次发布的评论
一种方法是更改子查询:
第一个:
(select cast(sessionOn as date) as DayOfSession,
case when Datepart(day,SessionOn) = Datepart(day,SessionOff) then
DATEDIFF(SECOND, sessionOn, sessionOff) else
DATEDIFF(second, sessionOn, cast(sessionOff as date))
end DurationInSec
from @x)
第二个查询:
(select cast(sessionOff as date) as DayOfSession,
case when Datepart(day,SessionOn) = Datepart(day,SessionOff) then 0 else
DATEDIFF(second, cast(sessionOff as date), sessionOff)
end DurationInSec
from @x)