时间和出勤

时间:2018-11-24 10:59:38

标签: sql crystal-reports report

我有一个包含以下数据的表

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个小时。

1 个答案:

答案 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。