Sql server 如何在SQLServer中获取同一列中两个日期的差值

Sql server 如何在SQLServer中获取同一列中两个日期的差值,sql-server,datetime,Sql Server,Datetime,如何获得同一列中两个相同日期的时差?如果在同一天有多个输入/输出呢 表tbl\u员工总名单: id First_Name Last_Name biometric_no ---------------------------------------------- 125 ABRAHAM JOSEPH MOQUETE 78 表officer\u timelogs employee_id record_time Day

如何获得同一列中两个相同日期的时差?如果在同一天有多个输入/输出呢

tbl\u员工总名单

id  First_Name       Last_Name    biometric_no
----------------------------------------------
125 ABRAHAM JOSEPH   MOQUETE           78
officer\u timelogs

employee_id      record_time             Day      type
--------------------------------------------------------
125         2018-02-27 18:03:31.000    Tuesday     1
125         2018-02-27 07:54:03.000    Tuesday     0
SQL查询:

select 
    a.employee_id, a.record_time, 
    --CONVERT(char(10), a.record_time, 103) as [Date],
    DATENAME(WEEKDAY, a.record_time) as [Day],
    a.[type],
    case 
       when a.[type] = 0
          then 'in'
       when a.[type] = 1
          then 'out'
    end as Status
from
    officer_timelogs a
left join 
    tbl_Employee_MasterList b on a.employee_id = b.biometric_no
where 
    a.employee_id = '125'
order by 
    a.record_time desc
输出:

employee_id record_time               Day       type    Status
---------------------------------------------------------------
     125    2018-02-28 07:47:23.000 Wednesday   0        in
     125    2018-02-27 18:03:31.000 Tuesday     1        out
     125    2018-02-27 07:54:03.000 Tuesday     0        in
     125    2018-02-26 18:01:59.000 Monday      1        out
     125    2018-02-26 07:48:25.000 Monday      0        in
     125    2018-02-24 12:50:00.000 Saturday    1        out
     125    2018-02-24 07:44:16.000 Saturday    0        in
     125    2018-02-23 17:02:06.000 Friday      1        out
     125    2018-02-23 07:48:26.000 Friday      0        in
     125    2018-02-22 18:02:35.000 Thursday    1        out
     125    2018-02-22 07:48:41.000 Thursday    0        in
所需输出(我希望检索如下数据):


我正在使用SQL Server 2012。

我只是使用了一个表来简化。加入并得到雇员的名字并不难。此查询根据您的要求计算先进先出之间的时间差。如果缺少in或out,则返回'00:00:00'

declare @t table (
    employee_id int
    , record_time datetime
    , type int
)
insert into @t 
values (125, '20180228 07:47:23.000', 0)
    , (125, '20180227 18:03:31.000', 1), (125, '20180227 07:54:03.000', 0)
    , (125, '20180226 18:01:59.000', 1), (125, '20180226 07:48:25.000', 0)
    , (125, '20180224 12:50:00.000', 1), (125, '20180224 07:44:16.000', 0)
    , (125, '20180223 17:02:06.000', 1), (125, '20180223 07:48:26.000', 0)
    , (125, '20180222 18:02:35.000', 1), (125, '20180222 07:48:41.000', 0)

select
    employee_id, [date]
    , [hours] = right(concat('00', diff / 3600), 2) + ':' + right(concat('00', diff % 3600 / 60), 2) + ':' + right(concat('00', diff % 60), 2)
from (
    select
        employee_id, [date] = cast(record_time as date)
        , diff = datediff(ss, min(iif(type = 0, record_time, null)), max(iif(type = 1, record_time, null)))
    from
        @t
    group by employee_id, cast(record_time as date)
) t
但我建议看看这个问题。它分别计算每个输入输出时间,然后得到每天的总和

select
    employee_id, [date]
    , [hours] = right(concat('00', diff / 3600), 2) + ':' + right(concat('00', diff % 3600 / 60), 2) + ':' + right(concat('00', diff % 60), 2)
from (
    select
        employee_id, [date] = cast(isnull([in], [out]) as date)
        , diff = sum(diff)
    from (
        select
            employee_id, [in] = max(iif(type = 0, record_time, null))
            , [out] = max(iif(type = 1, record_time, null))
            , diff = datediff(ss, max(iif(type = 0, record_time, null)), max(iif(type = 1, record_time, null)))
        from (
            select
                *, grp = sum(iif(type = 0, 1, 0)) over (partition by employee_id order by record_time)
            from
                @t
        ) t
        group by employee_id, grp
    ) t
    group by employee_id, cast(isnull([in], [out]) as date)
) t

学习如何提问!!!这是我第一次在这里提问,谢谢你的建议。请用文字代替图片。将现有查询添加到此问题中,并粘贴一些示例数据。图片上的所有内容都应该是问题中的文本。还要了解如何设置格式编辑工具栏中有一个小图标,看起来像这样的
{}
,请使用它设置代码或数据的格式谢谢。我已经编辑了我的问题。@AJMoquete,这还不够。提供一些示例数据,包括多个输入/输出以及该数据的预期输出
select
    employee_id, [date]
    , [hours] = right(concat('00', diff / 3600), 2) + ':' + right(concat('00', diff % 3600 / 60), 2) + ':' + right(concat('00', diff % 60), 2)
from (
    select
        employee_id, [date] = cast(isnull([in], [out]) as date)
        , diff = sum(diff)
    from (
        select
            employee_id, [in] = max(iif(type = 0, record_time, null))
            , [out] = max(iif(type = 1, record_time, null))
            , diff = datediff(ss, max(iif(type = 0, record_time, null)), max(iif(type = 1, record_time, null)))
        from (
            select
                *, grp = sum(iif(type = 0, 1, 0)) over (partition by employee_id order by record_time)
            from
                @t
        ) t
        group by employee_id, grp
    ) t
    group by employee_id, cast(isnull([in], [out]) as date)
) t