计算一天的总小时数

时间:2018-01-26 12:38:44

标签: sql-server

我正在编写报告,我想显示员工每天在办公室工作的总时间。员工多次进出办公室,因此每次保存数据。 我有这样的表格和记录。

CREATE TABLE Attendance
(
ID Int,
TimeIn datetime,
TimeOut datetime
);


INSERT INTO Attendance VALUES (1, '2018-01-18 09:37:25.000', '2018-01-18 11:12:25.000');
INSERT INTO Attendance VALUES (1, '2018-01-18 11:21:25.000', '2018-01-18 16:32:25.000');
INSERT INTO Attendance VALUES (1, '2018-01-18 16:37:25.000', '2018-01-18 17:55:25.000');
INSERT INTO Attendance VALUES (2, '2018-01-18 09:56:25.000', '2018-01-18 14:37:25.000');
INSERT INTO Attendance VALUES (2, '2018-01-18 15:00:25.000', '2018-01-18 18:27:25.000');
INSERT INTO Attendance VALUES (1, '2018-01-19 09:12:25.000', '2018-01-19 11:41:25.000');
INSERT INTO Attendance VALUES (1, '2018-01-19 13:23:25.000', '2018-01-19 13:31:25.000');
INSERT INTO Attendance VALUES (2, '2018-01-19 09:12:25.000', '2018-01-19 09:59:25.000');
INSERT INTO Attendance VALUES (2, '2018-01-19 12:55:25.000', '2018-01-19 13:12:25.000');
INSERT INTO Attendance VALUES (2, '2018-01-19 14:01:25.000', '2018-01-19 18:10:25.000');
INSERT INTO Attendance VALUES (1, '2018-01-19 17:31:25.000', '2018-01-19 18:51:25.000');

我希望结果显示如下。

ID  TimeIn TimeOut TimeIn TimeOut TimeIn TimeOut  TimeSpent          Day
1                                                 Calculated Hours   2018-01-18
2                                                 Calculated Hours   2018-01-18
1                                                 Calculated Hours   2018-01-19
2                                                 Calculated Hours   2018-01-19

如果可能的话,我们是否可以动态显示TimeIn和TimeOut?

2 个答案:

答案 0 :(得分:1)

分组本身可以通过常规小组来完成,但可能会在日期分组?如果是这样,group by子句可以在显示中使用相同的强制转换/转换:

SELECT ID, sum(DATEDIFF(MINUTE, TimeIn,TimeOut)) TotalMinutes,CAST(TimeIn as date)  Day
FROM Attendance
group by ID, CAST(TimeIn as date) 

随后,可以使用

格式化时间
select ID, format(TotalMinutes / 60, '0') + ':' + format(TotalMinutes % 60, '00'), Day
from(
    SELECT ID, sum(DATEDIFF(MINUTE, TimeIn,TimeOut)) TotalMinutes,CAST(TimeIn as date)  Day
    FROM @Attendance
    group by ID, CAST(TimeIn as date) 
) a

还没有看到有关动态列的添加信息。将尝试深入研究

编辑输入/输出列的可能性:

;with a as
(
    select *, cast(TimeIn as date) Day ,
        format(dateadd(MINUTE, sum( DATEDIFF( MINUTE , TimeIn,TimeOut)) over (partition by ID,cast(TimeIn as date)),0),'H:mm')  TimeSpent,
        cast(row_number() over (partition by ID, cast(TimeIn as date) order by TimeIn) as varchar) rnr 
    from Attendance
)
select * from 
    (select ID, Day, TimeSpent, 'In' + rnr Name, FORMAT(TimeIn, 'H:mm') T from a
        union all 
        select ID, Day, TimeSpent,'Out' +rnr, FORMAT(TimeOut, 'H:mm') from a) u
pivot(min(T) for Name in ([In1], [Out1], [In2], [Out2],[In3],[Out3], [In4], [Out4])) p --as much as desired

Sql Fiddle

答案 1 :(得分:1)

在一天内找到一个具有最大入/出次数的员工。并根据

更改查询中的列数
select
    id, day, TimeIn = max(iif(rn = 1, TimeIn, '')), TimeOut = max(iif(rn = 1, TimeOut, ''))
    , TimeIn = max(iif(rn = 2, TimeIn, '')), TimeOut = max(iif(rn = 2, TimeOut, ''))
    , TimeIn = max(iif(rn = 3, TimeIn, '')), TimeOut = max(iif(rn = 3, TimeOut, ''))
    , TimeIn = max(iif(rn = 4, TimeIn, '')), TimeOut = max(iif(rn = 4, TimeOut, ''))
    , TimeIn = max(iif(rn = 5, TimeIn, '')), TimeOut = max(iif(rn = 5, TimeOut, ''))
    , TimeSpent = concat(right(concat('0',sum(TimeSpent) / 60),2), ':', right(concat('0',sum(TimeSpent)%60),2))
    , Day
from (
    select
        id, cast(TimeIn as date) day, TimeIn = convert(char(8), TimeIn, 108)
        , TimeOut = convert(char(8), TimeOut, 108)
        , datediff(mi, TimeIn, TimeOut) TimeSpent
        , row_number() over (partition by id, cast(TimeIn as date) order by TimeIn) rn
    from 
        @Attendance
) t
group by id, day