计算每天的时间,但参数为两天

时间:2017-11-28 10:22:38

标签: sql sql-server sql-server-2014 calculation

我正在计算时间。

这里有一个例子:我有开放会话和会话的时间

enter image description here

我想计算一天的连接时间。这里的问题是断开时间是第二天 (在图片上)对于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

1 个答案:

答案 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的持续时间。

此持续时间在不同的子查询中计算,并为其分配了正确的日期(没有时间)。

现在,有基于日期的简单连接:)

此处的结果集:

enter image description here

关于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)