请假信息数据表:(请假状态: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语句才能达到我想要的效果呢!请各位多多帮忙,不胜感谢!

解决方案 »

  1.   

    time between to_date('20100801','yyyymmdd) and to_date('20100831','yyyymmdd)
    and to_char(time,'D') not in ('7','1')公休日比较麻烦.建议建张表存储公休日,然后关联来排除
      

  2.   

    增加一个表字段来判断
    如增加字段ABC :1(公休日),2(倒休日)等
      

  3.   

    Phoenix_99:请假信息数据表中有请假状态字段的
      

  4.   

    假设to_date('20100801','yyyymmdd)为:1,to_date('20100830','yyyymmdd)为: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如果还要统计公休日,那会麻烦点,具体原理相似。