请假信息数据表:(请假状态:0-请假;1-倒休;2-公休)
序号 部门ID 员工ID 员工姓名 请假状态 请假起始时间 请假截止时间
1 001 111 员1 0 2010-08-10 2010-08-13
2 002 222 员2 0 2010-08-14 2010-08-14
3 001 111 员1 1 2010-08-15 2010-08-16
4 002 333 员3 0 2010-08-02 2010-08-03
5 001 2 2010-08-17 2010-08-21
6 002 2 2010-08-22 2010-08-23
7 003 2 2010-08-24 2010-08-27其中,第5、6、7条为部门公休日,所有部门员工均放假,第1、5、7条中含有周六周日部门信息数据表:
部门ID,部门名称
001 部1
002 部2
003 部3需求:
做一个统计,主要内容为统计出在请假信息表中的员工在一段时间内(如“2010-08-01”到“2010-08-31”)的请假天数(不含周六周日),公休(不含周六周日)的天数,倒休的天数。要显示的内容:
部门ID,部门名称,员工ID,员工姓名,请假天数,倒休天数,公休天数
请问我该如何写sql语句才能达到我想要的效果呢!请各位多多帮忙,不胜感谢!
序号 部门ID 员工ID 员工姓名 请假状态 请假起始时间 请假截止时间
1 001 111 员1 0 2010-08-10 2010-08-13
2 002 222 员2 0 2010-08-14 2010-08-14
3 001 111 员1 1 2010-08-15 2010-08-16
4 002 333 员3 0 2010-08-02 2010-08-03
5 001 2 2010-08-17 2010-08-21
6 002 2 2010-08-22 2010-08-23
7 003 2 2010-08-24 2010-08-27其中,第5、6、7条为部门公休日,所有部门员工均放假,第1、5、7条中含有周六周日部门信息数据表:
部门ID,部门名称
001 部1
002 部2
003 部3需求:
做一个统计,主要内容为统计出在请假信息表中的员工在一段时间内(如“2010-08-01”到“2010-08-31”)的请假天数(不含周六周日),公休(不含周六周日)的天数,倒休的天数。要显示的内容:
部门ID,部门名称,员工ID,员工姓名,请假天数,倒休天数,公休天数
请问我该如何写sql语句才能达到我想要的效果呢!请各位多多帮忙,不胜感谢!
and to_char(time,'D') not in ('7','1')公休日比较麻烦.建议建张表存储公休日,然后关联来排除
如增加字段ABC :1(公休日),2(倒休日)等
一个时间段和另一个时间段对比倒是比较简单。例如:
starttime <=:2 and
endtime >=:1
注意先:2后:1不考虑公休日,只排除周六周日也容易。例如:
select 员工ID,count(1)
from (select :1+rownum-1 r from dual connect by rownum<=:2-:1+1) a,
<请假信息数据表> b
where a.r between b.starttime and b.endtime
and to_char(a.r,'D') not in('1','7')
group by 员工id如果还要统计公休日,那会麻烦点,具体原理相似。