SQL方法创建

# 查询时间段内的工作时间函数(剔除周末与非工作时间)
# 参数解释
# _st: 开始时间
# _ed: 结束时间
# _hour1: 工作时间开始小时
# _hour2: 工作时间结束小时
# _minute1: 工作时间开始分钟
# _minute2: 工作时间结束分钟
# 返回工作时间总分钟数DELIMITER $$
CREATE FUNCTION work_minute_sum(_st DATETIME, _ed DATETIME, _hour1 INT, _hour2 INT, _minute1 INT, _minute2 INT) RETURNS INTEGER
BEGINDECLARE _one_week_minute INT DEFAULT 10080;DECLARE _one_day_work_minute INT DEFAULT (_hour2 - _hour1) * 60 - _minute1 + _minute2;DECLARE _st_hour INT DEFAULT DATE_FORMAT(_st, '%H');DECLARE _ed_hour INT DEFAULT DATE_FORMAT(_ed, '%H');DECLARE _st_minute INT DEFAULT DATE_FORMAT(_st, '%i');DECLARE _ed_minute INT DEFAULT DATE_FORMAT(_ed, '%i');DECLARE _st_week INT DEFAULT DATE_FORMAT(_st, '%w');DECLARE _ed_week INT DEFAULT DATE_FORMAT(_ed, '%w');DECLARE _diffminute INT;DECLARE _che DATETIME;DECLARE _flag INT DEFAULT 1;DECLARE _week INT;DECLARE _hour_div INT;DECLARE _count_week INT DEFAULT 0;DECLARE _work_minute INT DEFAULT 0;IF ((_hour1 > _hour2) || (_hour1 = _hour2 && _minute1 >= _minute2)) THENRETURN 0;END IF;IF _st > _ed THEN SET _che = _st;SET _st = _ed;SET _ed = _che;SET _flag = -1;END IF;SET _diffminute = TIMESTAMPDIFF(MINUTE, _st, _ed);SET _count_week = _diffminute / _one_week_minute;SET _work_minute = _count_week * 5 * _one_day_work_minute;SET _st = DATE_ADD(_st, INTERVAL (_count_week * 7) DAY);IF (_st_week = 0 || _st_week = 6) THENSET _work_minute = _work_minute;ELSEIF ((_st_hour > _hour2) || (_st_hour = _hour2 && _st_minute >= _minute2)) THENSET _work_minute = _work_minute - _one_day_work_minute;ELSEIF (_st_hour > _hour1) || (_st_hour = _hour1 && _st_minute > _minute1) THENSET _hour_div = _st_hour - _hour1;SET _work_minute = _work_minute - (_hour_div * 60) - _st_minute + _minute1;END IF;IF _ed_week = 0 || _ed_week = 6 || _ed_hour < _st_hour || (_ed_hour = _st_hour && _ed_minute <= _st_minute) THENSET _work_minute = _work_minute;ELSEIF (_ed_hour < _hour1) || (_ed_hour = _hour1 && _ed_minute < _minute1) THENSET _work_minute = _work_minute - _one_day_work_minute;ELSEIF (_ed_hour < _hour2) || (_ed_hour = _hour2 && _ed_minute < _minute2) THENSET _hour_div = _hour2 - _ed_hour;SET _work_minute = _work_minute - (_hour_div * 60) + _ed_minute - _minute2;END IF;loop_cal:LOOPSET _week = DATE_FORMAT(_st, '%w');IF _st >= _ed THENLEAVE loop_cal;END IF;IF _week != 0 && _week != 6 THENSET _work_minute = _work_minute + _one_day_work_minute;END IF;SET _st = DATE_ADD(_st, INTERVAL 1 DAY);END LOOP;RETURN _work_minute * _flag;
END $$
DELIMITER ;

调用方法

#例:某公司工作时间为上午: 09:00 ~ 12:00,下午: 13:30 ~ 18:00,则在2019年3月3日0点到2019年3月13日22点的总工作时间是:
select work_minute_sum(‘2019-03-03 00:00:00’, ‘2019-03-13 22:00:00’, 9, 12, 0, 0) + work_minute_sum(‘2019-03-03 00:00:00’, ‘2019-03-13 22:00:00’, 13, 18, 30, 0);

mysql计算两个日期间的工作时长(参数传入每天上班时间,并剔除周末)相关推荐

  1. Python计算两个日期间的工作日(交易日),去除周末节假日

    首先区分一下这里的工作日和节假日是不同的. 工作日是指去掉节假日即周末,但是不去掉调休的日期. 交易日主要针对金融行业,是指去掉节假日和周末,因为周末金融市场也是停盘的,所以即使周末因为调休工作,也不 ...

  2. LocalDate计算两个日期间距离

    1.LocalDate提供了until()方法,计算了两个日期之间的年.月和日的周期 例如: from {@code 2017-08-28} to {@code 2018-09-30} is &quo ...

  3. period_diff()函数不能用于计算两个日期间的天数

    period_diff()函数返回两个日期之间的月份数,不能用于计算两个日期间的天数,比如 SELECT PERIOD_DIFF(20200325,20200404) FROM DUAL; 结果是9, ...

  4. 计算两个日期间有多少个工作日

    function TmainForm.WorksDay( //计算两个日期间有多少个工作日 mStartDate: TDate; //开始日期 mEndDate: TDate //终止日期 ): In ...

  5. 计算两个日期间相隔了多少周

    计算两个日期间相隔多少周,只要个了周日就算一周 /** * 计算两个日期间相隔的周数 * * @param startDate * 开始日期 * @param endDate * 结束日期 * @re ...

  6. oracle计算两个日期间的工作日(根据表配置)

    首先新增表用于配置非工作日,工作日,具体配置在程序中处理 DROP TABLE "T_WEEKDAY"; CREATE TABLE "T_WEEKDAY" (& ...

  7. DATEDIF计算两个日期间的天、月、年间隔数

    DATEDIF函数,主要用于计算两个日期之间的天数.月数或年数.其返回的值是两个日期之间的年\月\日间隔数. 基本语法:DATEDIF(Start_Date,End_Date,Unit) Start_ ...

  8. java计算两个日期间过了多少天

    再做一个小东西. 其中在数据库中有一个字段为datetime类型,想要计算两个日期之间过了多少天 多少小时 多少分钟. 思路为把时间换算为毫秒(与协调世界时 1970 年 1 月 1 日午夜之间的时间 ...

  9. JAVA 计算两个日期间的时间间隔

    public long getTime() Returns the number of milliseconds since January 1, 1970, 00:00:00 GMT represe ...

最新文章

  1. 【转】Docker 运行时资源限制-内存memory、交换机分区Swap、CPU
  2. spring注解controller示例
  3. 揭秘传智播客毕业班的超级薪水7k内幕系列II----Offer工资表5.7k,为什么不能让老师就业就业...
  4. UEM用户行为了如指掌!
  5. Oracle技术之ASM上恢复STANDBY数据库出现ORA-15173错误
  6. nginx+tomcat+redis实现session共享
  7. 谈谈我在敏捷开发中遇到的那些坑
  8. 【番外篇】ASP.NET MVC快速入门之免费jQuery控件库(MVC5+EF6)
  9. Zabbix动态监控磁盘I/O
  10. 转码服务器 作用,转码服务器工作原理介绍.pdf
  11. 【报错】table burner has no column named USER (code 1): , while compiling: INSERT INTO burner(USER,YELL
  12. 拓端tecdat|matlab使用长短期记忆(LSTM)神经网络对序列数据进行分类
  13. QTreeView 和QTreeWidget
  14. 用python爬取企查查_python爬取企查查江苏企业信息生成excel表格
  15. php 睡眠,win10睡眠是什么意思
  16. 揭秘 2023 年 Navicat 两大重磅功能 Redis + OceanBase 发布计划
  17. 关于如何在word中使用EndNote引用知网的文献
  18. ES5和ES6的继承有哪些优劣?
  19. NV12 和 NV21的区别
  20. c++工程error lnk2001解决方法

热门文章

  1. 3个5相乘列乘法算式_15个类型的速算巧算题目,打印出来给孩子练习一下
  2. FPGA实现简易电梯控制系统设计
  3. 如何正确的进行亚马逊关键词研究
  4. dbms chapter3
  5. ubuntu20.4安装ROS2 Noetic Ninjem
  6. nslookup网络管理命令行工具
  7. 2018伦敦市长交通战略
  8. K8s落地实践之旅 —— Pod(豌豆荚)
  9. 数学建模比赛超全整理【数学建模有哪些比赛?】【全网最全数模整理】
  10. Java 正则检测大写字母