Как накопить два datetime в двух таблицах, как VIEW в SQL Server 2014? - PullRequest
0 голосов
/ 22 января 2019

Как выполнить запрос для накопления двух столбцов даты и времени в двух таблицах в 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

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Подобно @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 для форматирования времени дляЧЧ: MI: SS формат

Надеюсь, это поможет

0 голосов
/ 22 января 2019

Для вашего текущего сценария вы можете попробовать выполнить следующее:

Предполагая, что идентификаторы IN и OUT после "-" будут совпадать с одной записью.

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-', '') 

Этот запрос будетне подходит для больших данных, так как REPLACE используется в JOIN.В идеале у вас должен быть один идентификатор для идентификации транзакций IN и OUT.

...