如何计算涵盖多周的2个日期之间的平均每周小时数?

时间:2014-11-10 18:50:15

标签: postgresql datetime

Postgresql 8.4。

我是这个概念的新手,所以如果人们可以教我,我会很感激。

对于奥巴马医改,每周工作30小时或以上的人必须获得与其他工作人员相同的医疗保健。我们负担不起,所以我们必须限制临时工和兼职人员的工作时间。这影响了整个国家。

  1. 我需要计算工作时间(加班时间无关紧要, 两个日期之间的常规时间,双倍时间等,比如2014年1月1日, 和2014年11月1日(星期六)的每个自定义周(周日的生命周期),而不是Postgresql定义的星期(星期一开始)。
  2. 我的每个定制工作周从星期日开始,到星期六结束。
  3. 我不知道是否必须在几周之内 他们平均没有工作,但我们假设我这样做。那个星期的零小时将减少平均值。
  4. 表名为'employeetime',日期字段为'employeetime.stopdate',每天工作小时数在'employeetime.hours'字段中,employeeid字段为'employeetime.empid'。
  5. 我更愿意在每个员工的一个查询中执行此操作,并且当我遍历员工时,我将对每个员工执行一次查询。如果不是,我愿意接受建议。但我想了解答案中提供的SQL。
  6. 目前EXTRACT(week from '2014-01-01')计算星期一的开始时间,因此对我不起作用。 Link here.
  7. 如果不这样做,我会如何做到这一点,每个人每个星期都要说一个单独的查询?我们有200人来处理。

    谢谢。

1 个答案:

答案 0 :(得分:2)

我已经设置了一个符合您格式的表格:

select * from employeetime order by date;

id date       hours
1  2014-11-06 10
1  2014-11-07 3
1  2014-11-08 5
1  2014-11-09 3
1  2014-11-10 5

你可以通过转移来获得周日开始的一周。注意,这里的第9个是星期日,所以这就是我们想要的边界。

select *, extract(week from date + '1 day'::interval) as week
from employeetime
order by week;

id date       hours week
1  2014-11-07 3     45
1  2014-11-06 10    45
1  2014-11-08 5     45
1  2014-11-09 3     46
1  2014-11-10 5     46

现在周日在周日而非周一转移。从这里开始,按周/员工获得小时数的查询很简单:

select id, sum(hours) as hours, extract(week from date + '1 day'::interval) as week 
from employeetime 
group by id, week
order by id, week;

id hours week
1  18    45
1  8     46