I use these functions that return weeks without days off between two dates:
CREATE FUNCTION [dbo].[DateDiff_NoWeekends]( @date1 DATETIME, @date2 DATETIME ) RETURNS INT AS BEGIN DECLARE @retValue INT SET @date1 = dbo.__CorrectDate(@date1, 1) SET @date2 = dbo.__CorrectDate(@date2, 0) IF (@date1 >= @date2) SET @retValue = 0 ELSE BEGIN DECLARE @days INT, @weekday INT SET @days = DATEDIFF(d, @date1, @date2) SET @weekday = DATEPART(dw, @date1) - 1 SET @retValue = DATEDIFF(s, @date1, @date2) - 2 * 24 * 3600 * ((@days + @weekday) / 7) END RETURN @retValue END GO CREATE FUNCTION [dbo].[__CorrectDate]( @date DATETIME, @forward INT ) RETURNS DATETIME AS BEGIN IF (DATEPART(dw, @date) > 5) BEGIN IF (@forward = 1) BEGIN SET @date = @date + (8 - DATEPART(dw, @date)) SET @date = DateAdd(Hour, (8 - DatePart(Hour, @date)), @date) END ELSE BEGIN SET @date = @date - (DATEPART(dw, @date)- 5) SET @date = DateAdd(Hour, (18 - DatePart(Hour, @date)), @date) END SET @date = DateAdd(Minute, -DatePart(Minute, @date), @date) SET @date = DateAdd(Second, -DatePart(Second, @date), @date) END RETURN @date END
Here is a demo version of the sql script for all days without days off in April (22).
SELECT [no weekend days in april] = (dbo.DateDiff_NoWeekends('2013-04-01','2013-05-01') / 3600 / 24)
source share