经国务院批准,国务院办公厅日前将2010年元旦、春节、清明节、劳动节、端午节、中秋节和国庆节放假调休日期的具体安排通知如下。一、元旦:1月1日至3日放假公休,共3天。二、春节:2月13日至19日放假调休,共7天。2月20日(星期六)、21日(星期日)上班。三、清明节:4月3日至5日放假公休,共3天。四、劳动节:5月1日至3日放假公休,共3天。五、端午节:6月14日至16日放假调休,共3天。6月12日(星期六)、13日(星期日)上班。六、中秋节:9月22日至24日放假调休,共3天。9月19日(星期日)、25日(星期六)上班。七、国庆节:10月1日至7日放假调休,共7天。9月26日(星期日)、10月9日(星期六)上班。
现需求如下:
    由于最近公司有个考勤管理的系统,要求求出其中考勤统计中每个员工的请假时间。
  如果请假日期为周六和周日或法定节假日。就把请假的时间减去相应的共有天数。
比如说我的请假单上填写的日期为:2010-05-01至2010-05-06,就说明我请假(或调休)时间为3天(因为其中有3天是节假日)
如果这请假(或调休)时间的3天里面还有周六或周日的话,就再需要减去1-2天,最后请假(或调休)时间则为2-1天。这就需要一个函数或存储过程求出一年中(以2010年为例)所有的周六和周日或节假日的具体日期数。如果节假日又恰好为周六或周日的话,(为了避免重复)那就只当作一个周六或周日的日期来看。
   然后根据请假的时间段,如:2010-05-01至2010-05-06,判断其是否包含在这些日期中,若包含的话,则再用请假(或调休)的总天数减去其中包含的天数。
    
   (如果可以的话!最好还帮我求出这些日期是该年的第几天?)
     不知到各位明白了我的意思了没!
   
    在举个例子:
    2010年2月13日至19日(春节)放假调休,共7天
   而我想过年时提前请假回家,请假日期为:2010年2月08日至19日.则春节(2月13日至19日放假调休,共7天) 包含在请假日期中.而2月13日至19日分别是2010年的第44天或第50天!    分如不够的话!我再开一帖!    现在项目时间紧,周一早上要用,急需各位大虾们帮忙解决!十分谢谢!

解决方案 »

  1.   

    设计一张日历表。 然后直接根据起始日期就知道有多少工作日了. 
    workCalendar(wdate date primary key,wkType int); -- 0 工作日,7 周未,9 法定假日
    wdate        wkType
    -----------  ------
    2010-Jan-01   0
    2010-Jan-02   7
    2010-Jan-03   7
    2010-Jan-04   0
    2010-Jan-05   0
    2010-Jan-06   0
    2010-Jan-07   0
    2010-Jan-08   0
    2010-Jan-09   7
    2010-Jan-10   7
    2010-Jan-11   0
    2010-Jan-12   0
    2010-Jan-13   0
    2010-Jan-14   0
    2010-Jan-15   0
    2010-Jan-16   7
    2010-Jan-17   7
    2010-Jan-18   0
    2010-Jan-19   0
    2010-Jan-20   0
    2010-Jan-21   0
    2010-Jan-22   0
    2010-Jan-23   7
    2010-Jan-24   7
    2010-Jan-25   0
    2010-Jan-26   0
    2010-Jan-27   0
    2010-Jan-28   0
    2010-Jan-29   0
    2010-Jan-30   7
    2010-Jan-31   7
    2010-Feb-01   0
    2010-Feb-02   0
    2010-Feb-03   0
    2010-Feb-04   0
    2010-Feb-05   0
    2010-Feb-06   7
    2010-Feb-07   7
    2010-Feb-08   0
    2010-Feb-09   0
    2010-Feb-10   0
    2010-Feb-11   0
    2010-Feb-12   0
    2010-Feb-13   9
    2010-Feb-14   9
    2010-Feb-15   9
    2010-Feb-16   7
    2010-Feb-17   7
    2010-Feb-18   7
    2010-Feb-19   7
    2010-Feb-20   0
    2010-Feb-21   0
    2010-Feb-22   0
    2010-Feb-23   0
    2010-Feb-24   0
    2010-Feb-25   0
    2010-Feb-26   0
    2010-Feb-27   7
    2010-Feb-28   7
    2010-Mar-01   0
    2010-Mar-02   0
    ....
      

  2.   


    顶这个。
    返回该年的第几天用函数 SELECT TO_CHAR(SYSDATE,'DDD') FROM DUAL; 就可以知道。