我有一个包含以下数据的表
EMPID | DEVICE | EVENTTIME
-----------------------------------------
112 | READ_IN | 2018-11-02 07:00:00.000
112 | READ_IN | 2018-11-02 08:00:00.000
112 | READ_OUT | 2018-11-02 12:00:00.000
112 | READ_IN | 2018-11-02 13:00:00.000
112 | READ_OUT | 2018-11-02 16:00:00.000
我需要选择查询才能获得以下数据:
ID_Emp |Date |TimeIn |TimeOut|Hours
112 |02/11/2018 |8:00 |16:00 |7:00
在我的桌子上,该员工是7:00来的,但他没有干工作,一个小时后又回来工作。他在12:00-13:00午休,并在16:00离开工作。所以他的总工作时间将是7个小时。
答案 0 :(得分:0)
首先,您需要消除12到1之间的时间,为此我编写了简单的where子句。之后 我使用PIVOT在最大EVENTTIME之前将行转置为列。 最后,我编写了最外层的SELECT查询,用于将列转换为您想要的格式。
这是提琴手链接:http://sqlfiddle.com/#!4/f1189/10
代码如下:
SELECT
EMPID,
TO_CHAR(READ_IN, 'HH24:MI') READ_IN,
TO_CHAR(READ_OUT, 'HH24:MI') READ_OUT,
EXTRACT(HOUR FROM READ_OUT - READ_IN) HOUR
FROM (
select * from (
select * from Table1
WHERE
extract(hour from eventtime) not between '12' and '13'
)
PIVOT (
MAX(EVENTTIME)
for DEVICE in ( 'READ_IN' READ_IN, 'READ_OUT' READ_OUT )
)
)
请注意,此示例仅适用于oracle。