如何在 SQL Server 2014 中将两个表中的两个日期时间累积为 VIEW?
How to accummulate two datetime in two tables as VIEW in SQL Server 2014?
如何在 SQL Server 2014 中查询在两个 table 中累积两个日期时间列?这是供您参考的示例:
入住 table
InID UserID CheckInTime
---------------------------------
IN-001 1 2018-11-10 08:00:00
IN-002 2 2018-11-15 07:00:00
退房 table
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
针对您目前的情况,您可以尝试如下操作。
假设“-”后的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 事务。
类似于@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 格式
希望对您有所帮助
如何在 SQL Server 2014 中查询在两个 table 中累积两个日期时间列?这是供您参考的示例:
入住 table
InID UserID CheckInTime
---------------------------------
IN-001 1 2018-11-10 08:00:00
IN-002 2 2018-11-15 07:00:00
退房 table
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
针对您目前的情况,您可以尝试如下操作。
假设“-”后的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 事务。
类似于@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 格式
希望对您有所帮助