如何在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,选择子查询作为别名
如何在.NET中以编程方式在SQL Server中获取VIEW的sql代码