序号 部门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语句才能达到我想要的效果呢!请各位多多帮忙,不胜感谢!
6 个解决方案
#1
time between to_date('20100801','yyyymmdd) and to_date('20100831','yyyymmdd)
and to_char(time,'D') not in ('7','1')
公休日比较麻烦.建议建张表存储公休日,然后关联来排除
and to_char(time,'D') not in ('7','1')
公休日比较麻烦.建议建张表存储公休日,然后关联来排除
#2
增加一个表字段来判断
如增加字段ABC :1(公休日),2(倒休日)等
如增加字段ABC :1(公休日),2(倒休日)等
#3
公休日不用考虑自动的,这个公休都是管理员填上去的,没填的话就当工作日处理
#4
Phoenix_99:请假信息数据表中有请假状态字段的
#5
周六周日的判断我知道该怎么些,问题是,请假或公休都是一个时间段,我把这个时间段和另一个时间段(即查询条件)进行比对,看请假时间段是否在查询条件时间段中,而且,还得排除掉周六周日,这个光想想就很头疼啊
#6
假设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
如果还要统计公休日,那会麻烦点,具体原理相似。
一个时间段和另一个时间段对比倒是比较简单。例如:
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
如果还要统计公休日,那会麻烦点,具体原理相似。
#1
time between to_date('20100801','yyyymmdd) and to_date('20100831','yyyymmdd)
and to_char(time,'D') not in ('7','1')
公休日比较麻烦.建议建张表存储公休日,然后关联来排除
and to_char(time,'D') not in ('7','1')
公休日比较麻烦.建议建张表存储公休日,然后关联来排除
#2
增加一个表字段来判断
如增加字段ABC :1(公休日),2(倒休日)等
如增加字段ABC :1(公休日),2(倒休日)等
#3
公休日不用考虑自动的,这个公休都是管理员填上去的,没填的话就当工作日处理
#4
Phoenix_99:请假信息数据表中有请假状态字段的
#5
周六周日的判断我知道该怎么些,问题是,请假或公休都是一个时间段,我把这个时间段和另一个时间段(即查询条件)进行比对,看请假时间段是否在查询条件时间段中,而且,还得排除掉周六周日,这个光想想就很头疼啊
#6
假设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
如果还要统计公休日,那会麻烦点,具体原理相似。
一个时间段和另一个时间段对比倒是比较简单。例如:
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
如果还要统计公休日,那会麻烦点,具体原理相似。