Sql server 合并两条记录以计算时间差

Sql server 合并两条记录以计算时间差,sql-server,Sql Server,我想根据intime和outtime计算两个事务之间的时差 请帮助我获得所需的输出 这是我的疑问: SELECT ssno, firstname, lastname, deptname, inreader, in_desc, intime, outreader, out_desc, outtime, CONVERT (VARCHAR(5), DATEADD(MINUTE, DATEDIFF(MINUTE, intime, outtime

我想根据
intime
outtime
计算两个事务之间的时差

请帮助我获得所需的输出

这是我的疑问:

SELECT 
    ssno, 
    firstname, lastname, 
    deptname, 
    inreader, in_desc, intime, 
    outreader, out_desc, outtime, 
    CONVERT (VARCHAR(5), DATEADD(MINUTE, DATEDIFF(MINUTE, intime, outtime), 0), 114) AS DIFF, 
    timeatt 
FROM
    (SELECT 
         eid, 
         ssno, 
         firstname, lastname, 
         deptname, 
         timeatt, 
         MIN(CASE 
                WHEN timeatt = 1 THEN intime 
                ELSE NULL 
             END) INTIME, 
         MIN(CASE 
                WHEN timeatt = 1 THEN INREADER 
                ELSE NULL 
             END) inreader, 
         MIN(CASE 
                WHEN timeatt = 1 THEN 'SWIPE IN' 
                ELSE NULL 
             END) AS IN_DESC, 
         MAX(CASE 
                WHEN timeatt = 2 THEN outtime 
                ELSE NULL 
             END) OUTTIME, 
         MAX(CASE 
                WHEN timeatt = 2 THEN 'SWIPE OUT' 
                ELSE NULL 
             END) AS OUT_DESC, 
         MAX(CASE 
                WHEN timeatt = 2 THEN OUTREADER 
                ELSE NULL 
             END) outreader, 
         DATEDIFF(MINUTE, outtime, intime) DIFF 
     FROM   
         (SELECT 
              E.empid EID, 
              EM.firstname, EM.lastname, 
              EM.ssno, 
              D.NAME DEPTNAME, 
              R.readerdesc AS INREADER, 
              R.readerdesc AS OUTREADER, 
              -- CAST (E.EVENT_TIME_UTC AS DATE) TIME3,  
              (CASE 
                  WHEN timeatt = 1 
                     THEN MIN(DATEADD(hh, 03, (E.event_time_utc))) 
                     ELSE NULL 
                  END) INTIME, 
              (CASE 
                  WHEN timeatt = 2 
                     THEN MAX(DATEADD(hh, 03, (E.event_time_utc))) 
                     ELSE NULL 
                END) OUTTIME, 
               R.timeatt 
           FROM   
               ((events E 
           INNER JOIN 
               emp EM ON (E.empid = EM.id)) 
           FULL JOIN 
               reader R ON E.devid = R.readerid 
                        AND E.machine = R.panelid) 
       FULL JOIN 
           udfemp UE ON (EM.id = UE.id) 
       FULL JOIN 
           dept D ON (UE.dept = D.id) 
       WHERE  
           E.eventid = '0' 
           AND E.empid = 31669 
           AND CAST(E.event_time_utc AS DATE) = '2019-08-28' 
       GROUP BY 
           CAST(E.event_time_utc AS DATE), 
           E.empid, EM.firstname, EM.lastname, 
           EM.ssno, D.NAME, R.readerdesc, R.timeatt) AS T1 
    GROUP BY 
        eid, 
        firstname, lastname, 
        ssno, 
        deptname, 
        DATEDIFF(MINUTE, outtime, intime), timeatt) AS T2 
--WHERE OUTTIME IS NOT NULL  
GROUP BY 
    eid, 
    firstname, lastname, ssno, 
    deptname, 
    DATEDIFF(MINUTE, outtime, intime), 
    intime, outtime, in_desc, out_desc, inreader, outreader, 
    timeatt 
ORDER BY 
    intime DESC; 
需要合并到单个记录中的输出,如前所述,这是为了计算一天的时差

谢谢
Santhosh

这可能会帮助您从GROUPBY子句中删除datetime列

请检查以下查询并让我们知道

SELECT ssno, firstname, lastname, deptname, inreader, in_desc, intime, outreader, out_desc, outtime, CONVERT (VARCHAR(5), DATEADD(MINUTE, DATEDIFF(MINUTE, intime, outtime), 0), 114) AS DIFF, timeatt FROM (SELECT eid, ssno, firstname, lastname, deptname, timeatt, MIN(CASE WHEN timeatt = 1 THEN intime ELSE NULL END) INTIME, MIN(CASE WHEN timeatt = 1 THEN INREADER ELSE NULL END) inreader, MIN(CASE WHEN timeatt = 1 THEN 'SWIPE IN' ELSE NULL END) AS IN_DESC, MAX(CASE WHEN timeatt = 2 THEN outtime ELSE NULL END) OUTTIME, MAX(CASE WHEN timeatt = 2 THEN 'SWIPE OUT' ELSE NULL END) AS OUT_DESC, MAX(CASE WHEN timeatt = 2 THEN OUTREADER ELSE NULL END) outreader, DATEDIFF(MINUTE, outtime, intime) DIFF FROM (SELECT E.empid EID, EM.firstname, EM.lastname, EM.ssno, D.NAME DEPTNAME, R.readerdesc AS INREADER, R.readerdesc AS OUTREADER, -- CAST (E.EVENT_TIME_UTC AS DATE) TIME3, (CASE WHEN timeatt = 1 THEN MIN(DATEADD(hh, 03, (E.event_time_utc))) ELSE NULL END) INTIME, (CASE WHEN timeatt = 2 THEN MAX(DATEADD(hh, 03, (E.event_time_utc))) ELSE NULL END) OUTTIME, R.timeatt FROM ((events E INNER JOIN emp EM ON (E.empid = EM.id)) FULL JOIN reader R ON E.devid = R.readerid AND E.machine = R.panelid) FULL JOIN udfemp UE ON (EM.id = UE.id) FULL JOIN dept D ON (UE.dept = D.id) WHERE E.eventid = '0' AND E.empid = 31669 AND CAST(E.event_time_utc AS DATE) = '2019-08-28' GROUP BY --CAST(E.event_time_utc AS DATE), -- This may be not needed.
     E.empid, EM.firstname, EM.lastname, EM.ssno, D.NAME, R.readerdesc, R.timeatt) AS T1 GROUP BY eid, firstname, lastname, ssno, deptname, --DATEDIFF(MINUTE, outtime, intime),-- This may be not needed.
     timeatt) AS T2 --WHERE OUTTIME IS NOT NULL GROUP BY eid, firstname, lastname, ssno, deptname, ---DATEDIFF(MINUTE, outtime, intime),-- This may be not needed.
     intime, outtime, in_desc, out_desc, inreader, outreader, timeatt ORDER BY intime DESC; 

样本数据(可消费样本数据,而非图像)和预期结果将帮助我们帮助您。感谢您的回复,我对SQL SERVER DB非常陌生,您能告诉我如何提供示例数据吗?我对如何提供示例数据有点困惑,因为结果是从多个表中获取数据。然后为每个表提供示例数据。感谢Jiken,我得到了相同的结果,记录在两个不同的行中。我想它应该是带有大小写的东西,我正在努力寻找,但没有得到。