mysql中跨月统计考勤天数-问答-阿里云开发者社区-阿里云

开发者社区> 落地花开啦> 正文

mysql中跨月统计考勤天数

2016-02-11 17:04:31 3660 2

如果在数据库中有这么一些数据

人员 请假开始时间 请假结束时间

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为周末。

取消 提交回答
全部回答(2)
  • 德哥
    2019-07-17 18:40:54

    如果是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)
    1 0
  • 落地花开啦
    2019-07-17 18:40:54

    先计数出两个时间的天数,n
    然后得到请假的开始那天是星期几 如 m(0-6)
    然后算出请假的周数 y=(n+m)/7
    计数出不满一周内 放假天数 如果大于5天放假一天
    x=(n+m)%7 >5 ? (n+m)%7 -5 : 0
    n-2y-x:就是请假的天数。

    0 0
添加回答
相关问答

17

回答

【大咖问答】对话PostgreSQL 中国社区发起人之一,阿里云数据库高级专家 德哥

阿里ACE 彭飞 2019-07-10 09:36:10 969989浏览量 回答数 17

145

回答

【新手入门】云服务器linux使用手册

fanyue88888 2012-11-26 17:14:18 157089浏览量 回答数 145

8

回答

OceanBase 使用动画(持续更新)

mq4096 2019-02-20 17:16:36 333885浏览量 回答数 8

22

回答

爬虫数据管理【问答合集】

我是管理员 2018-08-10 16:37:41 146793浏览量 回答数 22

2

回答

mySQL数据库报错You have an error in your SQL syntax

落地花开啦 2016-02-14 16:09:24 126561浏览量 回答数 2

38

回答

安全组详解,新手必看教程

我的中国 2017-11-30 15:23:46 256876浏览量 回答数 38

21

回答

请教一下数据量有100万条左右要什么配置?

易网网络 2013-03-27 15:18:02 192344浏览量 回答数 21

249

回答

阿里云LNAMP(Linux + Nginx + Apache + MySQL + PHP)环境一键安装脚本

云代维 2014-02-14 15:26:06 302612浏览量 回答数 249

97

回答

Redhat/CentOS一键安装web环境全攻略

xiaofanqie 2011-08-11 14:51:38 123214浏览量 回答数 97

2

回答

区域选择帮助

fanyue88888 2012-12-07 15:54:30 204011浏览量 回答数 2
+关注
落地花开啦
喜欢技术,喜欢努力的人
0
文章
7824
问答
推荐问答
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载