请教oracle中如何写SQL才能做到判断某段日期是否在另一段日期的范围内?

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

6 个解决方案

#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


公休日不用考虑自动的,这个公休都是管理员填上去的,没填的话就当工作日处理

#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

如果还要统计公休日,那会麻烦点,具体原理相似。
              

#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


公休日不用考虑自动的,这个公休都是管理员填上去的,没填的话就当工作日处理

#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

如果还要统计公休日,那会麻烦点,具体原理相似。