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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在SQL Server 2014中作为VIEW在两个表中累积两个日期时间?相关的知识,希望对你有一定的参考价值。

如何查询在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
答案

与@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格式

希望能帮助到你

另一答案

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

假设“ - ”之后的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事务。

以上是关于如何在SQL Server 2014中作为VIEW在两个表中累积两个日期时间?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL Server 2008 中恢复 SQL Server 2014 备份

从多个表中创建 Sql Server VIEW GROUPing BY,选择子查询作为别名

SQL Server, VIEW 混淆了数据

如何在.NET中以编程方式在SQL Server中获取VIEW的sql代码

SQL Server:如何从 VIEW 中获取序列的 NEXTVAL?

如何列出 VIEW 中列的源表名 (SQL Server 2005)