sql - 计算一个表中两个日期之间差异的TSQL问题

标签 sql tsql sql-server-2008

在 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/

相关文章:

SQL Server - 如何创建 IF EXISTS...SELECT AND SELECT

sql - 连接同一个表获取某些 ID 的重复行

sql-server-2008 - SQL Server中的Mid函数

sql - 使用 Korma 插入数据库行

sql-server - 可以在 VALUES 中没有行的情况下插入吗?

java - 使用注释在 Hibernate 中使用复合主键

sql - 在 select 语句中多次调用标量函数是否会多次运行该函数,如果是这样,如何解决这个问题

sql-server-2008 - 使用 SSDT Publish (.dacpac) 部署非空外键架构更新

mysql - 如何在此语句上创建条件 IF THEN?

mysql - SQL 将行内容连接到另一个表的列名称