Sql server 从三个表中获取datediff

Sql server 从三个表中获取datediff,sql-server,datetime,datediff,Sql Server,Datetime,Datediff,如何根据员工的日程安排以及首次入职和最后一次出职获得日期差异 下面是我正在使用的查询 select * from tbl_payroll_schedule where id in (3, 17, 18) 输出: id schedule_description time_in time_out schedule_status 3 REST DAY 1900-01-01 00:00:00.000 1900-01-01 00:00:00.000 1 17 0

如何根据员工的日程安排以及首次入职和最后一次出职获得日期差异

下面是我正在使用的查询

select * from tbl_payroll_schedule where id in (3, 17, 18)
输出:

id  schedule_description    time_in time_out    schedule_status
3   REST DAY            1900-01-01 00:00:00.000 1900-01-01 00:00:00.000 1
17  08:00 AM - 05:00 PM 1900-01-01 08:00:00.000 1900-01-01 17:00:00.000 1
18  08:00 AM - 12:00 PM 1900-01-01 08:00:00.000 1900-01-01 12:00:00.000 1

select mon.schedule_description as Monday,
        tue.schedule_description as Tuesday,
        wed.schedule_description as Wednesday,
        thu.schedule_description as Thursday,
        fri.schedule_description as Friday,
        sat.schedule_description as Saturday,
        sun.schedule_description as Sunday
        from employee_default_schedule ds

LEFT JOIN tbl_payroll_schedule mon on mon.id = ds.mon_sched
LEFT JOIN tbl_payroll_schedule tue on tue.id = ds.tues_sched
LEFT JOIN tbl_payroll_schedule wed on wed.id = ds.wed_sched
LEFT JOIN tbl_payroll_schedule thu on thu.id = ds.thurs_sched
LEFT JOIN tbl_payroll_schedule fri on fri.id = ds.fri_sched
LEFT JOIN tbl_payroll_schedule sat on sat.id = ds.sat_sched
LEFT JOIN tbl_payroll_schedule sun on sun.id = ds.sun_sched

WHERE ds.employee_id = 125
id      EID Name                        Time                Status
194664  125 MOQUETE, ABRAHAM JOSEPH Thu 08-16-2018 07:55:57 Time In
194703  125 MOQUETE, ABRAHAM JOSEPH Thu 08-16-2018 12:11:36 Time Out
194705  125 MOQUETE, ABRAHAM JOSEPH Thu 08-16-2018 12:28:12 Time In
194757  125 MOQUETE, ABRAHAM JOSEPH Thu 08-16-2018 20:45:08 Time Out
输出:

目前我可以得到总工作时间,我想得到迟到和加班时间

select
    employee_id as EID, 
    FORMAT(date, 'MM-dd-yyyy') as [Date], 
    DATENAME(WEEKDAY, date) as [Day],
    right(concat('00', diff / 4100), 2) + ':' + right(concat('00', diff % 3600 / 60), 2) + ':' + right(concat('00', diff % 60), 2) as TWH
    from (select
            employee_id, 
            [date] = cast(actual_time as date), 
            diff = datediff(ss, min(iif(type = 0, actual_time, null)), max(iif(type = 1, actual_time, null)))
        from
            officer_timelogs
            where employee_id = (CASE WHEN @employee_id = 0 THEN employee_id else @employee_id END)
        group by employee_id, cast(actual_time as date)
        ) t
    where t.date >= @dateFrom and t.date <= @dateTo
    order by date asc

请发布您的表架构、示例数据和预期结果result@Squirrel我添加了我的预期结果。您的表架构和示例数据如何?@Squirrel我包括每个查询结果的屏幕截图。您的查询涉及多个表,如
tbl\u payroll\u schedule、employee\u default\u schedule、officer\u timelogs、,tbl_员工_主列表
。我们需要知道这些表的模式,样本数据。您显示的是查询的结果。此外,我们更喜欢文本而不是屏幕。屏幕我们无法复制和粘贴用于测试的数据。请参阅
select
    employee_id as EID, 
    FORMAT(date, 'MM-dd-yyyy') as [Date], 
    DATENAME(WEEKDAY, date) as [Day],
    right(concat('00', diff / 4100), 2) + ':' + right(concat('00', diff % 3600 / 60), 2) + ':' + right(concat('00', diff % 60), 2) as TWH
    from (select
            employee_id, 
            [date] = cast(actual_time as date), 
            diff = datediff(ss, min(iif(type = 0, actual_time, null)), max(iif(type = 1, actual_time, null)))
        from
            officer_timelogs
            where employee_id = (CASE WHEN @employee_id = 0 THEN employee_id else @employee_id END)
        group by employee_id, cast(actual_time as date)
        ) t
    where t.date >= @dateFrom and t.date <= @dateTo
    order by date asc
EID Date        Day         TWH        Late    OT
125 08-16-2018  Thursday    11:49:11