如果在数据库中有这么一些数据
人员 请假开始时间 请假结束时间
XX1 2012-10-28 08:30 2012-11-05 17:30
XX2 2012-11-02 08:30 2012-11-07 13:30
XX1 2012-11-08 13:30 2012-11-09 17:30
......多条记录
如何统计某人在11月份的请假时间,剔除休息日11月3、4为周末。
如果是PostgreSQL,你可以这样来实现:
首先需要创建一个剔除周末的函数:
create or replace function minus_weekend(timestamp, timestamp) returns interval as
$$
declare
s timestamp := $1;
e timestamp := $2;
sd date;
ed date;
i interval := interval '0';
x int;
x1 interval;
x2 interval;
begin
if e < s then
s := $2;
e := $1;
end if;
select case when extract(isodow from s) not in (6,7) then date(s+interval '1 day')-s else interval '0' end,
case when extract(isodow from e) not in (6,7) then e-date(e) else interval '0' end
into x1, x2;
if date(e)-date(s) = 0 then
if extract(isodow from s) not in (6,7) then
return e-s;
else
return interval '0';
end if;
elsif date(e)-date(s) = 1 then
return x1 + x2;
end if;
sd := date(s)+1;
ed := date(e);
for x in 0..(ed-sd-1) loop
if extract(isodow from sd+x) not in (6,7) then
i := i + interval '1 day';
end if;
end loop;
return i+x1+x2;
end;
$$
language plpgsql strict;
接下来就可以使用这个函数满足你的需求
postgres=> create table tbl(username name, begin_time timestamp, end_time timestamp);
CREATE TABLE
postgres=> insert into tbl values ('a','2012-10-28 08:30','2012-11-05 17:30');
INSERT 0 1
postgres=> insert into tbl values ('b','2012-11-02 08:30', '2012-11-07 13:30');
INSERT 0 1
postgres=> insert into tbl values ('a','2012-11-08 13:30', '2012-11-09 17:30');
INSERT 0 1
postgres=> select sum(minus_weekend(begin_time,end_time)) from tbl where username='a' ;
sum
-----------------
5 days 45:30:00
(1 row)
先计数出两个时间的天数,n
然后得到请假的开始那天是星期几 如 m(0-6)
然后算出请假的周数 y=(n+m)/7
计数出不满一周内 放假天数 如果大于5天放假一天
x=(n+m)%7 >5 ? (n+m)%7 -5 : 0
n-2y-x:就是请假的天数。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。