SQL语句计算两个日期之间有多少个工作日的方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL语句计算两个日期之间有多少个工作日的方法相关的知识,希望对你有一定的参考价值。

/*
因为工作中一个奇怪的需求,要用SQL语言计算两个日期间有多少个工作日。
设定是一个星期有5个工作日,从星期一到星期五
说明:
第一个星期的工作日数:DATEPART(dw, @begdt)-DATEPART(dw, @begdt),最少0天
末一个星期的工作日数:DATEPART(dw, @enddt),最多5天
计算方法:
如果两个日期处在同一个星期内,直接计算“第一个星期的工作日数”
否则按下面的公式计算
(两个日期间的总天数 - 第一个星期的天数 - 末一个星期的天数) / 7 * 5
+ 第一个星期的工作日数
+ 末一个星期的工作日数
*/

--计算并返回两个日期间的工作小时数(工作日*8)按周一到周五计算
--必须先SET DATEFIRST 1
CREATE FUNCTION dbo.CalcWorkHours(@bdate DATETIME, @edate DATETIME)
RETURNS INTEGER
AS BEGIN
DECLARE @hours INTEGER
IF @@DATEFIRST <> 1 OR @bdate > @edate
RETURN -1
SELECT @hours =
--如果终止日期与起始日期在同一个星期内,只需要计算有几天即可
CASE WHEN DATEPART(wk, @edate-1)-DATEPART(wk,@bdate) = 0 THEN
CASE WHEN DATEPART(dw, @bdate) > 5 THEN 0
WHEN DATEPART(dw, @edate-1) > 5 THEN 6 - DATEPART(dw, @bdate)
ELSE DATEPART(dw, @edate-1) - DATEPART(dw, @bdate) + 1 END
--如果终止日期与起始日期在不同的星期内
--首先计算出除前后两个星期外完整的星期数 * 5
ELSE (DATEDIFF(dd,@bdate,@edate)
- (8-DATEPART(dw, @bdate))
- DATEPART(dw, @edate-1)) / 7 * 5
--再加上第一个星期里的工作日数
+ CASE WHEN DATEPART(dw, @bdate) < 6 THEN 6 - DATEPART(dw, @bdate)
ELSE 0 END
--加上末一个星期里的工作日数
+ CASE WHEN DATEPART(dw, @edate-1)>5 THEN 5 ELSE DATEPART(dw, @edate-1) END
END * 8
RETURN @hours
END
参考技术A oralce :
select round(to_number(to_date('2016-12-22','yyyy-MM-dd')-to_date('2016-12-12','yyyy-MM-dd'))) from dual;
mysql:
SELECT DATEDIFF('2008-12-30','2008-12-29') AS DiffDate
参考技术B 日历日有函数--DateDiff()
工作日就没有办法了。
参考技术C datediff方法

利用SQL语句如何获得两个日期之间相差的天数

我想用SQL语句得到两个日期(date1、date2)之间相差的天数,返回值为数值型,其中date1为数据库里输入数据时的时间,date2为当前系统时间

用sysdate假设结束日期字段是end_date

添加这个判断条件:

where to_char("end_date",'YYYY') = to_char(sysdate,'YYYY') 判断年相同

and to_char("end_date",'MM') = to_char(sysdate,'MM') 判断月相同

and to_char("end_date",'dd') - to_char(sysdate,'dd') = 15 判断日相同

或者:

where to_char("end_date",'YYYY-MM-DD') - to_char(sysdate,'YYYY-MM-DD')=15

扩展资料:

注意事项

DATEDIFF返回跨两个指定日期的日期和时间边界数。 

语法:DATEDIFF ( datepart , startdate , enddate ) 

参数:datepart

是规定了应在日期的哪一部分计算差额的参数。下表列出了 Microsoft® SQL Server™ 识别的日期部分和缩写。

startdate是返回datetime或smalldatetime值或日期格式字符串的表达式。 因为smalldatetime只精确到分钟,所以当用smalldatetime值时,秒和毫秒总是 0。

如果只指定年份的最后两位数字,则小于或等于"两位数年份截止期"配置选项的值的最后两位数字的数字所在世纪与截止年所在世纪相同。大于该选项的值的最后两位数字的数字所在世纪为截止年所在世纪的前一个世纪。例如,如果 two digit year cutoff 为 2049(默认),则 49 被解释为 2049,2050 被解释为 1950。为避免模糊,请使用四位数的年份。

有关时间值指定的更多信息,请参见时间格式。有关日期指定的更多信息,请参见 datetime 和 smalldatetime。 

enddate是计算的终止日期。enddate 是返回 datetime 或 smalldatetime 值或日期格式字符串的表达式。

返回类型:integer

注释:startdate 是从 enddate 减去。如果 startdate 比 enddate 晚,返回负值。当结果超出整数值范围,DATEDIFF 产生错误。对于毫秒,最大数是 24 天 20 小时 31 分钟零 23.647 秒。对于秒,最大数是 68 年。

参考技术A 求两个日期(date1、date2)之间相差的天数用datediff函数,返回值为数值型,可以用cast函数或者convert函数

declare @a datetime
set @a ='2013-04-09'
select cast((datediff(day,@a,getdate()))as int)

结果为:7

你的需求sql语句为
select cast((datediff(day,date1,date2 ))as int)

或者可以这样select convert(int,date2)-cast(date1 as int)
参考技术B

可以用datediff函数。

创建表及插入数据:

create table test
(begindate datetime,
enddate datetime);

insert into test values ('2015-01-01','2015-07-13')

执行:

select datediff(day,begindate,enddate) from test;

结果:

参考技术C 用sysdate 假设结束日期字段是 end_date
那么就添加这个判断条件
where to_char("end_date",'YYYY') = to_char(sysdate,'YYYY') 判断年相同
and to_char("end_date",'MM') = to_char(sysdate,'MM') 判断月相同
and to_char("end_date",'dd') - to_char(sysdate,'dd') = 15 判断日相同
当然 不知道这样是否可行
where to_char("end_date",'YYYY-MM-DD') - to_char(sysdate,'YYYY-MM-DD')=15
你都可以试一下 希望能够帮助你
参考技术D select Datediff(dd,'[输入的时间]',getdate()) <=====Datediff()函数去看看吧,能对数据库的时间操作的。dd表示的是日期。

以上是关于SQL语句计算两个日期之间有多少个工作日的方法的主要内容,如果未能解决你的问题,请参考以下文章

SQL是计算两个日期相差多少天数的函数?

mysql 计算两个日期间有多少个2月29

SQL工作日查询

(013)每日SQL学习:确定两个日期之间的工作日天数和计算一年周内各日期次数

SQL 计算两个日期相差多少天数的函数

excel,求计算时间公式,与指定之间之间的还有多少个工作日