在Postgres中获得具有特定范围日期系列的员工的出勤率

时间:2016-10-12 15:17:50

标签: postgresql

我有一个带有employee_id,日期和打卡时间的考勤表。

Emp_Id     PunchTime
101      10/10/2016 07:15
101      10/10/2016 12:20
101      10/10/2016 12:50
101      10/10/2016 16:31
102      10/10/2016 07:15

这里我只有工作日的日期。我想获得一系列给定日期的员工出勤名单。我也需要这一天。结果应如下所示

date        |  day     |employee_id |   Intime          |     outtime       |
2016-10-09  |  sunday  |   101      |                   |                   |
2016-10-10  |  monday  |   101      | 2016-10-10 7:15AM |2016-10-10 4:31 PM |

2 个答案:

答案 0 :(得分:0)

您可以生成日期列表,然后对它们进行外部联接:

以下显示十月的所有日期:

select d.date, a.emp_id, 
       min(punchtime) as intime, 
       max(punchtime) as outtime
from generate_series(date '2016-10-01', date '2016-11-01' - 1, interval '1' day) as d (date)
  left join attendance a on d.date = a.punchtime::date
group by d.date, a.emp_id;
order by d.date, a.emp_id;

如果您想要每天的第一个和最后一个时间戳,可以使用简单的group by查询来完成。

然而,这将不会重复不存在日期的emp_id。

答案 1 :(得分:0)

以下内容将生成一系列日期列表(以您的打卡时间表中的任何范围开始和结束),员工和银行时间,每个时间的停机时间。在这里检查SQL小提琴:

http://sqlfiddle.com/#!15/d93bd/1

pip install