我需要计算两个日期之间工作日的差异。 SQL Server中是否有内置函数?有人可以提供一个如何做到这一点的例子吗?
答案 0 :(得分:0)
这是我写的很快的内容。只需将其封装到一个函数或任何你需要的函数中。
declare @StartDate datetime
declare @EndDate datetime
declare @TotalDiff int
declare @NumberOfWeekends int
SET @StartDate = '3/12/2013'
SET @EndDate = '3/22/2013'
SET @NumberOfWeekends = 0
SET @TotalDiff = DATEDIFF(d,@StartDate, @EndDate)
If @TotalDiff > 7
SET @NumberOfWeekends = @TotalDiff / 7
else if DATEPART(dd, @EndDate) < DATEPART(DD, @StartDate)
SET @NumberOfWeekends = 1
select (@TotalDiff - 2*@NumberOfWeekends) as TotalWorkDays
答案 1 :(得分:0)
不,SQL Server内置了任何内容,无法直接为您提供两个日期之间的工作日数,但是有一些内置函数可以让您编写一个。
首先,一些警告
世界不能同意“工作日”是什么。对于我们大多数人来说,这是周六和周日。在中东的大部分地区,它是周五和周五。星期六(星期日是正常的工作日)
世界上当然不能就什么构成公众假期达成一致,这几乎总是被视为非工作日。
您尚未指定处理这些案例的方式,因此我们做出一些假设:
现在,鉴于类型为@date
的{{1}},确定特定日期是星期六还是星期日在sql中很容易:
DateTime
考虑到这一点,给定开始日期和结束日期,您可以从IF DATENAME(dw,@date) IN ('Saturday','Sunday')
到@startDate
@endDate
注意:这是非侵犯性的,所以不会计算DECLARE @startDate DATETIME = '2013-01-01'
DECLARE @endDate DATETIME = '2013-01-20'
DECLARE @currDate DATETIME = @startDate
DECLARE @numDays INT = 0
WHILE @currDate<@endDate
BEGIN
IF DATENAME(dw,@currDate) NOT IN ('Saturday','Sunday')
SET @numDays = @numDays + 1
SET @currDate = DATEADD(day,1,@currDate)
END
SELECT @numDays
。您可以将@endDate
更改为WHILE @currDate<@endDate
答案 2 :(得分:0)
我的解决方案不计算@EndDate,因此,如果需要更改它,只需在@ d2上加1。
首先,我计算从“初始”日期(恰好是1/1/1900,一个星期一)到@StartDate和@EndDate的天数:
DECLARE @d1 int = DATEDIFF(Day, 0, @StartDate);
DECLARE @d2 int = DATEDIFF(Day, 0, @EndDate);
然后,@ StartDate和@EndDate之间的总天数为:
@d2 - @d1
据此,我减去间隔中的周日数和周六数,每一个均以与总天数类似的差异进行计算,但现在是整周(7天)。为了得到整周数,我将整数除以7,并将“初始”天(0)表示为星期一。该间隔中的星期天数是
@d2/7 - @d1/7
而周六是
(@d2+1)/7 - (@d1+1)/7
放在一起,我的解决方案是:
DECLARE @StartDate DATETIME = '20180101'
DECLARE @EndDate DATETIME = '20180201'
DECLARE @d1 int = DATEDIFF(Day, 0, @StartDate)
DECLARE @d2 int = DATEDIFF(Day, 0, @EndDate)
SELECT @d2 - @d1 - (@d2/7 - @d1/7) - ((@d2+1)/7 - (@d1+1)/7) AS workdays