在 MSSQL 2008 中,我有如下所示的表和数据
create table #tempData
(user_id int,type varchar(10),ts datetime)
insert into #tempData
select 1,'ENTER','2011-01-30 15:00:00'
union all
select 1,'EXIT','2011-01-31 16:00:00'
union all
select 1,'ENTER','2011-02-1 18:00:00'
union all
select 1,'EXIT','2011-02-10 21:00:00'
union all
select 2,'ENTER','2011-01-10 21:00:00'
union all
select 2,'EXIT','2011-01-12 21:00:00'
union all
select 2,'ENTER','2011-01-13 01:00:00'
union all
select 2,'EXIT','2011-01-13 18:00:00'
--AND SO ON --
现在我尝试进行查询,根据上次导出判断一个用户在里面多长时间
类似
user_id,exited,time_in_hours
1,'2011-01-31 16:00:00',25
1,'2011-02-10 21:00:00',219
2,'2011-01-12 21:00:00',48
2,'2011-01-13 18:00:00',17
很抱歉,如果这个 BAD 或 ROUGE 问题,如果这不是提出这样的问题的正确方式。 但我已经为此苦苦思索了一段时间。
最佳答案
假设
同一用户 session 不相交,
没有相应的 ENTER 记录就不能有 EXIT 记录,
您可以尝试以下方法:
WITH ranked AS (
SELECT
user_id,
type,
ts,
rn = ROW_NUMBER() OVER (PARTITION BY user_id, type ORDER BY ts)
FROM #tempData
)
SELECT
tx.user_id,
exited = tx.ts,
hours = DATEDIFF(HOUR, tn.ts, tx.ts)
FROM ranked tn
INNER JOIN ranked tx ON tn.user_id = tx.user_id AND tn.rn = tx.rn
WHERE tn.type = 'ENTER'
AND tx.type = 'EXIT'
关于sql - 计算一个表中两个日期之间差异的TSQL问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6898289/