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天假
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)