Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server 2008查询以计算连续事件之间的总时间_Sql Server_Tsql_Sql Server 2008 R2 - Fatal编程技术网

Sql server SQL Server 2008查询以计算连续事件之间的总时间

Sql server SQL Server 2008查询以计算连续事件之间的总时间,sql-server,tsql,sql-server-2008-r2,Sql Server,Tsql,Sql Server 2008 R2,我希望能够计算SQL Server 2008中某些事件之间的总时间 我的表格如下: UserId Event EventTimestamp +-------+----------+---------------+ 1 CheckedIn 14-05-15 10:01 2 CheckedIn 14-05-15 10:15 3 CheckedIn 14-05-15 10:17 1 CheckedOut 14-05-15 10

我希望能够计算SQL Server 2008中某些事件之间的总时间

我的表格如下:

UserId   Event      EventTimestamp
+-------+----------+---------------+
 1       CheckedIn  14-05-15 10:01
 2       CheckedIn  14-05-15 10:15
 3       CheckedIn  14-05-15 10:17
 1       CheckedOut 14-05-15 10:25
 1       Logout     14-05-15 10:26
如果查看该表,用户可以签入,然后签出,然后脱机

我想计算一个人从签到退房的时间,按每周分组,其中签到和退房之间的时间不到10分钟

到目前为止,我已经设法按周分组,但我似乎无法计算这些事件之间的持续时间,而这些事件将按顺序发生

select      
   'Week ' + cast(datepart(wk, EventUpdateStamp) as varchar(2)) Week,     
    UserId,
    Event 
from MyTable 
group by datepart(wk, EventUpdateStamp), UserId, Event 
我希望得到如下结果:

UserId   TotalSessionCheckInTimeMinutes  WeekNumber   
+-------+------------------------------+---------------+
 1       24                             43
以第一行为例:

1是用户的ID 24是两次操作之间的总持续时间(以分钟为单位) 入住和退房 43是一年中的周数 我只想把入住登记包括在退房登记中。不想测量签出和注销之间的距离,换句话说,测量他签入的时间。

试试这个:

SELECT t1.UserId, 
    DATEDIFF(minute,
        t1.EventTimestamp,
        (SELECT MIN(t3.EventTimestamp)
        FROM MyTable t3
        WHERE t3.UserId = t1.UserId
        AND t3.EventTimestamp> t1.EventTimestamp)
    ), 
   CAST(DATEPART(wk, EventTimestamp) as varchar(2)) Week
FROM MyTable t1
WHERE EXISTS(
    SELECT 'NEXT'
    FROM MyTable t2
   WHERE t2.UserId = t1.UserId
   AND t2.EventTimestamp> t1.EventTimestamp
   AND t2.Event != 'Logout')
SqlFiddle

去试试这个:

SELECT t1.UserId, 
    DATEDIFF(minute,
        t1.EventTimestamp,
        (SELECT MIN(t3.EventTimestamp)
        FROM MyTable t3
        WHERE t3.UserId = t1.UserId
        AND t3.EventTimestamp> t1.EventTimestamp)
    ), 
   CAST(DATEPART(wk, EventTimestamp) as varchar(2)) Week
FROM MyTable t1
WHERE EXISTS(
    SELECT 'NEXT'
    FROM MyTable t2
   WHERE t2.UserId = t1.UserId
   AND t2.EventTimestamp> t1.EventTimestamp
   AND t2.Event != 'Logout')
SqlFiddle

你可以试试这个:

SELECT DISTINCT M.UserId, DATEPART(HOUR,A.TotalSessionCheckInTimeMinutes)*60 + DATEPART(MINUTE,A.TotalSessionCheckInTimeMinutes) AS TotalSessionCheckInTimeMinutes, DATEPART(WEEKDAY, M.EventTimestamp) FROM Mytable M
     CROSS APPLY (
        SELECT CAST((M1.EventTimestamp - M2.EventTimestamp) AS TIME) AS TotalSessionCheckInTimeMinutes
        FROM Mytable M1
          CROSS JOIN Mytable M2
            WHERE M1.Event = 'CheckOut' AND M2.Event = 'CheckIn' AND M1.UserId = M.UserId) AS A
UNION ALL
SELECT DISTINCT M.UserId, A.TotalSessionCheckInTimeMinutes, DATEPART(WEEKDAY, M.EventTimestamp) FROM Mytable M
     CROSS APPLY (
       SELECT CAST((M1.EventTimestamp - M2.EventTimestamp) AS TIME) AS TotalSessionCheckInTimeMinutes
       FROM Mytable M1
          CROSS JOIN Mytable M2
            WHERE M1.Event = 'LogOut' AND M2.Event = 'CheckIn' AND M1.UserId = M.UserId) AS A
您可以尝试以下方法:

SELECT DISTINCT M.UserId, DATEPART(HOUR,A.TotalSessionCheckInTimeMinutes)*60 + DATEPART(MINUTE,A.TotalSessionCheckInTimeMinutes) AS TotalSessionCheckInTimeMinutes, DATEPART(WEEKDAY, M.EventTimestamp) FROM Mytable M
     CROSS APPLY (
        SELECT CAST((M1.EventTimestamp - M2.EventTimestamp) AS TIME) AS TotalSessionCheckInTimeMinutes
        FROM Mytable M1
          CROSS JOIN Mytable M2
            WHERE M1.Event = 'CheckOut' AND M2.Event = 'CheckIn' AND M1.UserId = M.UserId) AS A
UNION ALL
SELECT DISTINCT M.UserId, A.TotalSessionCheckInTimeMinutes, DATEPART(WEEKDAY, M.EventTimestamp) FROM Mytable M
     CROSS APPLY (
       SELECT CAST((M1.EventTimestamp - M2.EventTimestamp) AS TIME) AS TotalSessionCheckInTimeMinutes
       FROM Mytable M1
          CROSS JOIN Mytable M2
            WHERE M1.Event = 'LogOut' AND M2.Event = 'CheckIn' AND M1.UserId = M.UserId) AS A


你能解释一下这一排的结果吗:11043?。10是指10:00?SQL Server版本2008 R21 10 43:1是用户ID,24是用户签入和签出之间的总持续时间(分钟),43是一年中的周数。@Ashestoash:我认为第二行必须是:1 1 1 43,其中1是用户ID,1是签出和注销之间的差异,43周数。对吗?我们只想包括签入和签出,所以排除120结果,因为我们不想衡量签出和注销之间的差异。意思是他在办公室呆了多久你能解释一下你这一排的结果吗:11043?。10是指10:00?SQL Server版本2008 R21 10 43:1是用户ID,24是用户签入和签出之间的总持续时间(分钟),43是一年中的周数。@Ashestoash:我认为第二行必须是:1 1 1 43,其中1是用户ID,1是签出和注销之间的差异,43周数。对吗?我们只想包括签入和签出,所以排除120结果,因为我们不想衡量签出和注销之间的差异。意思是他在办公室呆了多长时间。它给出了一个错误,说它不知道“t”是什么。当我将t.UserId更改为t1.UserId时,我会得到结果,但它们都是负值。另外,我注意到您没有与事件进行比较?已修复。t、 UserId->t1.UserId我在Sql Fiddle上试过,但今天不行了是的,我在Sql Fiddle上没能用,但对我也不起作用:我在我的电脑上试过。结果是:12420/120ah对不起,我误解了你之前的评论,我们只想包括签入和签出,因此,排除120结果,因为我们不想在签出和注销之间进行测量。意思是他在办公室呆了多久。它给出了一个错误,说它不知道什么是“不”。当我将t.UserId更改为t1.UserId时,我会得到结果,但它们都是负值。另外,我注意到您没有与事件进行比较?已修复。t、 UserId->t1.UserId我在Sql Fiddle上试过,但今天不行了是的,我在Sql Fiddle上没能用,但对我也不起作用:我在我的电脑上试过。结果是:12420/120ah对不起,我误解了你之前的评论,我们只想包括签入和签出,因此,排除120结果,因为我们不想在签出和注销之间进行测量。意思是他在办公室的时间。似乎没有给出正确的数据,因为它给了我一个TotalSessionCheckInTimeMinutes 1899年的日期和错误的周数。我认为我的代码中存在问题:M1.EventTimestamp-M2.EventTimestamp。您可以使用转换或强制转换:谢谢-我想你很接近了,但它说的是“操作数类型冲突:int与时间不兼容”,下面是模式:在[PRIMARY]上创建表[dbo]。[MyTable][UserId][int]不为NULL,[Event][varchar]30不为NULL,[EventTimestamp][datetime]不为NULL你可以参考中的答案,它似乎没有给出正确的数据,因为它给了我一个TotalSessionCheckInTimeMinutes 1899年的日期和错误的周数。我认为我的代码中存在问题:M1.EventTimestamp-M2.EventTimestamp。您可以使用转换或强制转换:谢谢-我想你很接近了,但它说“操作数类型冲突:int与时间不兼容”,这是一个模式:在[PRIMARY]上创建表[dbo]。[MyTable][UserId][int]不为NULL,[Event][varchar]30不为NULL,[EventTimestamp][datetime]不为NULL。你可以在[PRIMARY]上引用答案