实现获取 两个时间之间的工作日工作时长(mysql)

实现功能:

 计算两个时间之间的时长:

要求:

 1. 计算工作日

 2. 只计算 8:00-20:00 之间的时间,其他时间不计入时长

计算逻辑:

1. 首先维护一个表 ,该表存储假期信息

CREATE TABLE `holiday` (`id` int(10) NOT NULL AUTO_INCREMENT, -- 表主键`holiday` varchar(8) DEFAULT NULL, -- 假期 格式为 20010101PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC

2. 实现逻辑

  1. 对于给定的开始和结束时间,函数首先检查这两个时间点的有效性。
  2. 然后,它遍历每一天,为每一天设置工作开始和结束时间(08:00-20:00)。
  3. 如果当前处理的开始时间早于当天的工作开始时间,它将被调整为工作开始时间。
  4. 确定每天的当前结束时间,它是输入的结束时间和当天工作结束时间的最小值。
  5. 如果当前开始时间在工作时间内,计算并累加时长。
  6. 最后,跳转到下一天,重复这个过程,直到覆盖整个时间范围。

sql实现如下:

CREATE FUNCTION calculate_working_hours(start_datetime DATETIME, end_datetime DATETIME)
RETURNS DECIMAL(10,2)
BEGINDECLARE total_hours DECIMAL(10,2) DEFAULT 0.0;DECLARE work_start_time DATETIME;DECLARE work_end_time DATETIME;DECLARE current_start DATETIME;DECLARE current_end DATETIME;DECLARE current_date_1 INT;DECLARE is_holiday BOOLEAN;-- 确保开始时间早于结束时间IF start_datetime >= end_datetime THENRETURN 0.0;END IF;-- 初始化当前开始时间为输入的开始时间SET current_start = start_datetime;-- 循环遍历每一天,直到超过结束时间WHILE current_start < end_datetime DO-- 将当前日期转换为yyyymmdd格式SET current_date_1 = DATE_FORMAT(current_start, '%Y%m%d') + 0; -- 加0转换为整数-- 检查当前日期是否为假期SET is_holiday = EXISTS(SELECT 1 FROM holiday WHERE holiday = current_date_1);-- 如果不是假期,则计算工作时间IF NOT is_holiday THEN-- 设置当天的工作开始和结束时间SET work_start_time = CONCAT(DATE(current_start), ' 08:00:00');SET work_end_time = CONCAT(DATE(current_start), ' 20:00:00');-- 如果当前开始时间小于当天的工作开始时间,则从工作开始时间计算IF current_start < work_start_time THENSET current_start = work_start_time;END IF;-- 设置当前结束时间为最小值:输入的结束时间或当天的工作结束时间SET current_end = LEAST(end_datetime, work_end_time);-- 如果当前开始时间在工作时间内,增加时长IF current_start < current_end THENSET total_hours = total_hours + TIMESTAMPDIFF(MINUTE, current_start, current_end) / 60.0;END IF;END IF;-- 移到下一天的开始(不管是不是假期)SET current_start = CONCAT(DATE(current_start + INTERVAL 1 DAY), ' 08:00:00');END WHILE;RETURN ROUND(total_hours, 2);
END  ;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/699577.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在Linux Ubuntu系统使用Docker快速部署MongoDB并公网访问

文章目录 前言1. 安装Docker2. 使用Docker拉取MongoDB镜像3. 创建并启动MongoDB容器4. 本地连接测试5. 公网远程访问本地MongoDB容器5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定TCP地址远程访问 前言 本文主要介绍如何在Linux Ubuntu系统使用Docker快速部署Mon…

不要再使用lock来锁定,这种方式让你更省事

设置读写锁为写入模式独占资源&#xff0c;其他写入请求需要等待本次写入结束之后才能继续写入注意&#xff1a;长时间持有读线程锁或写线程锁会使其他线程发生饥饿 (starve)。 为了得到最好的性能&#xff0c;需要考虑重新构造应用程序以将写访问的持续时间减少到最小。从性能…

Ubuntu 21.04 设置ai服务开机自启动的两种方法

Ubuntu 21.04 设置ai服务开机自启动的两种方法 方法1 /lib/systemd/system方法2 /etc/systemd/system 方法1 /lib/systemd/system 1.1.修改/lib/systemd/system/rc-local.service&#xff0c;如果没有需要新建&#xff0c;添加[Install]的内容&#xff0c;文件内容为 [Unit] …

互联网加竞赛 机器视觉 opencv 深度学习 驾驶人脸疲劳检测系统 -python

文章目录 0 前言1 课题背景2 Dlib人脸识别2.1 简介2.2 Dlib优点2.3 相关代码2.4 人脸数据库2.5 人脸录入加识别效果 3 疲劳检测算法3.1 眼睛检测算法3.2 打哈欠检测算法3.3 点头检测算法 4 PyQt54.1 简介4.2相关界面代码 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#x…

uniapp使用sqlite

1、判断数据库是否打开 isOpen() {let open plus.sqlite.isOpenDatabase({name: this.dbName,path: this.dbPath})return open;} 2、创建数据库(有就打开) openSqlite() {return new Promise((resolve, reject) > {plus.sqlite.openDatabase({name: this.dbName,path: th…

【Spring连载】使用Spring Data访问 MongoDB(七)----会话和事务

【Spring连载】使用Spring Data访问 MongoDB&#xff08;七&#xff09;----Sessions & Transactions 一级目录二级目录三级目录 一级目录 二级目录 三级目录

8.qt5使用opencv的库函数打开图片

1.配置opencv动态库的环境变量 2.在创建的qt工程中加入如下opencv代码&#xff0c;具体代码如下&#xff1a; 使用opencv库函数显示图片

C/C++ BM17 二分查找-I

文章目录 前言题目解决方案一1.1 思路阐述1.2 源码 总结 前言 一篇简单的二分查找的运用 题目 描述 请实现无重复数字的升序数组的二分查找 给定一个 元素升序的、无重复数字的整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如…

Linux进一步研究权限-----------ACL使用

一、使用情况 1.1、场景: 某个大公司&#xff0c;在一个部门&#xff0c;有一个经理和手下有两个员工&#xff0c;在操控一个Linux项目,项目又分为三期做&#xff0c;然而一期比较重要&#xff0c;经理带着员工做完了&#xff0c;公司就觉得技术难点已经做完攻克了&#xff0…

【自然语言处理-二-attention注意力 是什么】

自然语言处理二-attention 注意力机制 自然语言处理二-attention 注意力记忆能力回顾下RNN&#xff08;也包括LSTM GRU&#xff09;解决memory问题改进后基于attention注意力的modelmatch操作softmax操作softmax值与hidder layer的值做weight sum 计算和将计算出来的和作为memo…

《Python 语音转换简易速速上手小册》第1章 Python语音处理概述(2024 最新版)

文章目录 1.1 语音处理的基础1.1.1 基础知识1.1.2 主要案例:自动语音识别系统案例介绍案例 Demo案例分析1.1.3 扩展案例 1:智能虚拟助手案例介绍案例 Demo案例分析1.1.4 扩展案例 2:情感分析系统案例介绍案例 Demo

NATS学习笔记(一)

NATS是什么&#xff1f; NATS是一个开源的、轻量级、高性能的消息传递系统&#xff0c;它基于发布/订阅模式&#xff0c;由Apcera公司开发和维护。 NATS的功能 发布/订阅&#xff1a;NATS的核心是一个发布/订阅消息传递系统&#xff0c;允许消息生产者发布消息到特定的主题…

.Net 8.0 新的变化

.NET 8 是微软于2021年8月24日宣布的下一代编程语言和框架&#xff0c;它是 .NET 宇宙的一部分&#xff0c;与 C# (Common Language Infrastructure) 紧密集成。.NET 8 引入了许多新功能&#xff0c;如原生编译、值类型 (Value Types)、结构化并发 (structured concurrency) 和…

2024生物发酵魅力展示会-光德流体

参展企业介绍 河北光德流体控制有限公司始建于1996年&#xff0c;是一家从事以不锈钢为母材的洁净应用材料研发与专业制造的实体企业。产品主要包括卫生级球阀&#xff0c;隔膜阀&#xff0c;蝶阀等&#xff0c;并广泛应用于生物发酵&#xff0c;医疗制药&#xff0c;食品饮料…

初识51单片机

##江科大51单片机学习 什么是单片机&#xff1f;&#xff1f;&#xff1f; 单片机&#xff0c;英文名&#xff0c;Micro Controller Unit&#xff0c;简称MCU&#xff08;tips&#xff1a;有人会简称它为CPU&#xff0c;但不是如此&#xff0c;CPU其实被集成在MCU中&#xff…

【Elasticsearch专栏 11】深入探索:Elasticsearch如何支持多租户架构

文章目录 Elasticsearch如何支持多租户架构&#xff1f;01 隔离方式1 索引隔离2 集群隔离3 基于路由的隔离 02 配置示例1.索引隔离配置2.基于路由的隔离配置 03 实现原理04 权限控制1.定义角色2.分配用户角色 05 安全性考虑06 总结 Elasticsearch如何支持多租户架构&#xff1f…

【python】使用OpenCV进行行人检测

请确保在运行代码之前已经安装了 OpenCV 库&#xff0c;可以使用以下命令来安装&#xff1a; pip install opencv-python4.2.0.32 使用 OpenCV 中的 HOG 特征和默认的行人检测器来检测指定文件夹 "images" 中的图像中是否有行人&#xff0c;并将检测到行人的原始图…

视频评论抓取软件|抖音数据抓取工具

最近我们推出了一款基于C#语言开发的工具。这款工具提供了丰富的功能&#xff0c;旨在帮助用户轻松获取抖音视频内容。让我们一起来详细介绍一下这款工具的主要功能模块&#xff1a; 1. 批量视频提取&#xff1a; 工具提供了便捷的批量视频提取功能&#xff0c;用户只需输入关…

vue3 多层级组件传值

1. 传统方式&#xff1a;父组件通过Props将值逐级传递给要接受的子组件 // 父组件<child :data"list"></child><script lang"ts" setup> import { reactive, toRefs} from vue; const state reactive({list:[] })const { list} toRe…

第3部分 原理篇2去中心化数字身份标识符(DID)(3)

3.2.2.4. DID文档 (DID Document) 本聪老师&#xff1a;DID标识符和DID URL还都只是ID&#xff0c;必须为它附加一个基本属性才可以证明是该主体独有的。这个就是我们下面介绍的DID文档。 本聪老师&#xff1a;每个DID标识符都唯一对应一个DID文档&#xff0c;也可以说&#x…