sql 请假天数的计算问题 排除节假日和周末

sql 请假天数的计算问题 排除节假日和周末,第1张

select a.id,a.姓名,a.状态,开始日期,结束日期,

       max(结束日期)-max(开始日期)+1-count(b.workdate) as 请假天数

from a

left join b on b.status in ('节假日','周末') 

            and b.workdate between a.开 始日期 and a.结束日期

group by a.id,a.姓名,a.状态,开始日期,结束日期

我先把我建立的数据发出来(只是为了测试,可能不是很严谨):

首先是创建数据表(mysql中命令行):

 create table fangjia(

 id int(4) not null primary key auto_increment,

 begin date not null,

 end date not null)

然后是插入测试数据:

mysql> insert into fangjia (begin,end) values ('2011-02-13','2011-02-18'),('2011

-02-22','2011-02-28'),('2011-03-12','2011-03-16')

目前数据表有的数据为:

mysql> select * from fangjia

+----+------------+------------+

| id | begin      | end        |

+----+------------+------------+

|  1 | 2011-02-13 | 2011-02-18 |

|  2 | 2011-02-22 | 2011-02-28 |

|  3 | 2011-03-12 | 2011-03-16 |

+----+------------+------------+

下面是php代码:

header('Content-type:text/htmlcharset="utf-8"')

$con = mysql_connect('localhost','root','')//这里根据你自己的情况来写

mysql_select_db('test',$con)//这里根据你自己的情况来写

$queryBegin = "2011-02-16"//这是要查询的开始日期

$queryEnd = "2011-03-15"//这里是要查询的结束日期

$ab = mysql_query("select * from fangjia where begin <='{$queryEnd}' and end >='{$queryBegin}'")//只有数据库中,begin字段的值 小于等于 开始日期,并且end字段的值 大于等于 结束日期的时候,才是符合条件的

while($value=mysql_fetch_assoc($ab)){

$beginDate = strtotime($value['begin'])>strtotime($queryBegin) ? strtotime($value['begin']) :strtotime($queryBegin)//转化为时间戳来运算,如果字段begin的日期大于开始日期,那么计算时使用的开始日期就是end字段的值,否则为开始日期的值

$endDate = strtotime($value['end'])  <strtotime($queryEnd)   ? strtotime($value['end']) :strtotime($queryEnd)//原理同上

$day = (($endDate-$beginDate)/(3600*24))+1//转化为天数

echo 'id为'.$value['id'].'的人请了'.$day.'天假<br>'

}

//以上代码的运行结果为:

//id为1的人请了3天假

//id为2的人请了7天假

//id为3的人请了4天假


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/8734403.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-20
下一篇 2023-04-20

发表评论

登录后才能评论

评论列表(0条)

保存