您似乎已将日期和时间放在单独的列中,这使所需的算术变得复杂。因此,以下将 logindate 与 logintime 结合起来,对于注销数据也是如此。然后可以计算(每行)或聚合(如此处所示)以秒为单位的差异。
我使用 CROSS APPLY 来执行大部分计算,这样做纯粹是为了允许在输出时通过别名 ca.duration 重用结果。我还尝试显示更简单的子查询来帮助跟踪逻辑。
nb:我使用的最终显示逻辑与 Cory 在我之前的回答中使用的相同。
SQL Fiddle
MS SQL Server 2008 架构设置:
CREATE TABLE lgu00
([logindate] date, [logintime] time, [logoutdate] date, [logouttime] time)
;
INSERT INTO lgu00
([logindate], [logintime], [logoutdate], [logouttime])
VALUES
('2015-10-05', '09:00:00', '2015-10-10', '11:01:10'),
('2015-10-07', '09:00:00', '2015-10-10', '12:02:01'),
('2015-10-06', '09:00:00', '2015-10-10', '13:03:20'),
('2015-10-08', '09:00:00', '2015-10-10', '14:04:02'),
('2015-10-09', '09:00:00', '2015-10-10', '15:05:30'),
('2015-10-10', '09:00:00', '2015-10-10', '16:06:03'),
('2015-10-11', '09:00:00', '2015-10-11', '17:07:40')
;
查询 1:
select
RIGHT('0' + CONVERT(VARCHAR(6), SUM(ca.duration) / 3600 ), 2 )
+ ':'
+ RIGHT('0' + CONVERT(VARCHAR(2), SUM(ca.duration) % 3600 / 60 ), 2 )
+ ':'
+ RIGHT('0' + CONVERT(VARCHAR(2), SUM(ca.duration) % 60 ), 2 )
AS [hh:mm:ss]
, SUM(ca.duration) AS [In Seconds]
FROM lgu00 t
CROSS APPLY (
SELECT DATEDIFF(second
, DATEADD(day,DATEDIFF(day,0,t.logindate),cast(t.logintime AS datetime))
, DATEADD(day,DATEDIFF(day,0,t.logoutdate),cast(t.logouttime AS datetime))
)
) ca (duration)
WHERE t.logindate >= '20150101' AND t.logoutdate < '20151101'
Results:
| hh:mm:ss | In Seconds |
|----------|------------|
| 95:29:46 | 1423786 |
查询 2:
select
login
, logout
from lgu00
cross apply (
select
dateadd(day,datediff(day,0,logindate),cast(logintime as datetime)) as login
, dateadd(day,datediff(day,0,logoutdate),cast(logouttime as datetime)) as logout
) ca1
cross apply (
select datediff(second,ca1.login,ca1.logout) as duration
) ca2
Results:
| login | logout |
|---------------------------|---------------------------|
| October, 05 2015 09:00:00 | October, 10 2015 11:01:10 |
| October, 07 2015 09:00:00 | October, 10 2015 12:02:01 |
| October, 06 2015 09:00:00 | October, 10 2015 13:03:20 |
| October, 08 2015 09:00:00 | October, 10 2015 14:04:02 |
| October, 09 2015 09:00:00 | October, 10 2015 15:05:30 |
| October, 10 2015 09:00:00 | October, 10 2015 16:06:03 |
| October, 11 2015 09:00:00 | October, 11 2015 17:07:40 |
查询 3:
select
duration
from lgu00
cross apply (
select datediff(second
, dateadd(day,datediff(day,0,logindate),cast(logintime as datetime))
, dateadd(day,datediff(day,0,logoutdate),cast(logouttime as datetime))
)
) ca (duration)
Results:
| duration |
|----------|
| 439270 |
| 270121 |
| 360200 |
| 191042 |
| 108330 |
| 25563 |
| 29260 |