如何在SQL Server 2014中作为VIEW在两个表中累积两个日期时间?

问题描述 投票:1回答:2

如何查询在SQL Server 2014中的两个表中累积两个日期时间列?这是一个供您参考的示例:

登记表

InID       UserID     CheckInTime
---------------------------------
IN-001     1          2018-11-10 08:00:00
IN-002     2          2018-11-15 07:00:00

退房表

OutID      UserID     CheckOutTime
----------------------------------
OUT-001    1          2018-11-10 12:00:00
OUT-002    2          2018-11-15 14:00:00

结果集(预期)

ResultID     UserID    InID     OutID     WorkTimeinHour
--------------------------------------------------------
1            1         IN-001   OUT-001   4
2            2         IN-002   OUT-002   7
sql-server tsql sql-server-2014
2个回答
2
投票

与@PSK类似,我使用STUFF函数替换“IN-”和“OUT-”字符

但由于这些操作处于JOIN条件,因此这些操作会导致性能下降最好在两个表中使用数字列,而不是使用包含字符串列的无用“IN-”和“OUT-”

select
    i.UserId, i.InID, CheckInTime, o.OutID, CheckOutTime,
    dbo.fn_CreateTimeFromSeconds(DATEDIFF(ss, CheckInTime, CheckOutTime)) as TotalTime
from CheckIn i
inner join CheckOut o
    on i.UserId = o.UserId and
       STUFF (i.InID,1,3,'') = STUFF (o.OutID,1,4,'')

另外,我使用自定义用户定义的fn_CreateTimeFromSeconds function to format time用于HH:MI:SS格式

希望能帮助到你


1
投票

对于您当前的方案,您可以尝试以下方式。

假设“ - ”之后的IN和OUT id与一个条目相同。

SELECT ROW_NUMBER() 
         OVER( 
           ORDER BY (SELECT NULL)) AS ResultIt, 
       T1.inid, 
       T2.outid, 
       DATEDIFF(hh, T2.checkouttime, T1.checkintime) 
FROM   checkin T1 
       INNER JOIN checkout T2 
               ON REPLACE(T1.inid, 'IN-', '') = REPLACE(T2.outid, 'OUT-', '') 

由于在JOIN中使用了REPLACE,因此该查询对大数据不起作用。理想情况下,您应该有一个标识符来标识IN和OUT事务。

© www.soinside.com 2019 - 2024. All rights reserved.