转载:MYSQL编写两日期之间的工作日函数

本文详细介绍了如何在MySQL中创建一个自定义函数workdaynum,用于计算两个日期之间的有效工作日数量。通过复杂的条件判断和CASE语句,确保了函数能够准确地排除周末和跨越年份的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

感谢原链接:
https://blog.youkuaiyun.com/adayan_2015/article/details/79624387#commentBox
#公式的内容不一定准确 但是逻辑一定要搞清楚 以后不可以运行这个,条件语句不一定正确哈哈哈
DROP FUNCTION IF EXISTS workdaynum ; #注意分号
delimIter #是告诉MySQL解释器,该段命令是否已经结束了,mysql是否可以执行了 最后有相对应的
CREATE FUNCTION workdaynum (datefrom date,dateto date) #创建公式 create function 函数名(参数 类型,参数 类型)
#需要注意 创建参数以及函数名时不加引号
RETURNS INT(20) NO SQL #创建完毕,必须返回一个值 返回数据类型 但是NO SQL 不知道是什么意思
BEGIN #开始执行
DECLARE days INT DEFAULT(1); #声明变量 default DEFAULT 约束用于向列中插入默认值
#如果没有规定其他的值,那么会将默认值添加到所有的新记录。
IF (datefrom>dateto OR YEAR (datefrom) <> YEAR (dateto))
THEN RETURN -1;
END IF;
#if then return end if;
SET days = CASE
WHEN WEEK (datefrom) =WEEK (dateto) THEN
dateto-datefrom+ 1 - CASE
WHEN DAYOFWEEK( datefrom ) > 1
AND DAYOFWEEK( DATETO ) < 7 THEN
0
WHEN DAYOFWEEK( DATEFROM ) = 1
AND DAYOFWEEK( DATETO ) = 7 THEN
2
ELSE
1
END
ELSE DATETO - DATEFROM - (
WEEK ( DATETO ) - WEEK ( DATEFROM )
) * 2 - CASE
WHEN DAYOFWEEK( DATEFROM ) = 1
AND DAYOFWEEK( DATETO ) = 7 THEN
2
WHEN DAYOFWEEK( DATEFROM ) = 1
AND DAYOFWEEK( DATETO ) <> 7 THEN
1
WHEN DAYOFWEEK( DATEFROM ) <> 1
AND DAYOFWEEK( DATETO ) = 7 THEN
1
ELSE
0
END
#注意第二次声明变量时,条件语句中又包含一个条件语句,这个以后也可运用
END; #与case相对应
RETURN DAYS; #必须返回值
end$$ #与begin相对应
delimiter

上面有一处不能显示,附图如下:第一个delimiter后面必须有符号$$
在这里插入图片描述
这边标注的很仔细 是因为
1.之前没有用sql编写函数
2.没有用到条件语句中又包含条件语句的情况

所以这篇对我是个陌生且有趣的知识,以后可以运用起来。
感谢原链接
https://blog.youkuaiyun.com/adayan_2015/article/details/79624387#commentBox

### 计算日期相减后的小时数 在 SQL 中,不同数据库管理系统 (DBMS) 提供了不同的函数来计算日期之间的差异。以下是几种常见 DBMS 的实现方式。 --- #### **1. 在 SQL Server 中** SQL Server 提供了 `DATEDIFF` 函数,该函数可以用来计算日期之间的差值,并支持多种时间单位(如秒、分钟、小时等)。要获取日期之间的小时数,可使用如下语句: ```sql SELECT DATEDIFF(HOUR, StartDate, EndDate) AS HourDifference FROM YourTable; ``` 在此查询中: - `StartDate` 是起始日期。 - `EndDate` 是结束日期。 - 参数 `HOUR` 指定了返回的结果是以小时为单位的差值[^1]。 如果需要精确到小数位(即包含不足一整小时的部分),可以通过将分钟差除以 60 来实现: ```sql SELECT CAST(DATEDIFF(MINUTE, StartDate, EndDate) / 60.0 AS DECIMAL(9, 2)) AS CycleHours FROM YourTable; ``` 这种方法能够更精细地表示时间间隔中的小时部分。 --- #### **2. 在 MySQL 中** MySQL 同样提供了 `TIMESTAMPDIFF` 函数用于计算日期间的差异。为了得到日期间相差的小时数,可以用以下语法: ```sql SELECT TIMESTAMPDIFF(HOUR, StartDate, EndDate) AS HourDifference FROM YourTable; ``` 同样地,若希望获得带有小数精度的结果,则可通过计算总秒数并转换为小时完成: ```sql SELECT ROUND((UNIX_TIMESTAMP(EndDate) - UNIX_TIMESTAMP(StartDate)) / 3600, 2) AS CycleHours FROM YourTable; ``` 这里利用了 `UNIX_TIMESTAMP` 返回自 Unix 纪元以来的秒数,之后将其转化为小时数值[^2]。 --- #### **3. 在 Oracle 数据库中** Oracle 支持直接对日期类型做减法运算,其结果是一个浮点数,代表之间的天数差。由于一天等于 24 小时,所以只需乘以 24 即可得出小时总数: ```sql SELECT (EndDate - StartDate) * 24 AS HourDifference FROM YourTable; ``` 此外,也可以借助 `NUMTODSINTERVAL` 函数进一步增强灵活性,比如只关注特定时间段内的有效工作小时等等[^2]。 --- #### **注意事项** 无论在哪种环境下编写此类查询,都应确保所涉及列的数据类型确实为日期或 datetime 类型;如果不是的话,可能需要先进行必要的类型转换操作。另外还需注意跨越夏令时或其他特殊情形可能导致的实际耗时不符预期等问题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值