Click here to Skip to main content
15,889,822 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
i want to exclude saturday and sunday while calculating date.for example if my date period is 5, and calculating from today , i need the result day as 12/26/2012.
Posted
Updated 26-Nov-19 22:44pm
Comments
charlie literato 23-May-14 8:43am    
please help me, I would like to Exclude Holidays to display using sql queries, I have a separate table for list of holidays and the date came from table valued functions

Try
SQL
DECLARE @Date DATETIME
SET @Date = GETDATE()

DECLARE @DaysToAdd INT
SET @DaysToAdd = 5

DECLARE @DayOfWeek INT

SELECT @DayOfWeek = CASE WHEN DATENAME(w,@Date) = 'Sunday' THEN 1
			WHEN DATENAME(w,@Date) = 'Monday' THEN 2
			WHEN DATENAME(w,@Date) = 'Tuesday' THEN 3
			WHEN DATENAME(w,@Date) = 'Wednesday' THEN 4
			WHEN DATENAME(w,@Date) = 'Thursday' THEN 5
			WHEN DATENAME(w,@Date) = 'Friday' THEN 6
			WHEN DATENAME(w,@Date) = 'Saturday' THEN 7 END 

IF @DaysToAdd + @DayOfWeek < 7
BEGIN

	SELECT CONVERT(VARCHAR,DATEADD(DAY,@DaysToAdd, @Date),101)

END
ELSE
BEGIN

	SELECT CONVERT(VARCHAR,DATEADD(DAY,@DaysToAdd+2, @Date),101)

END


[Edit]
The above sample will give incorrect result if the number of days being added is more than 7. So i have come up with another approach.
SQL
DECLARE @Date DATETIME
SET @Date = GETDATE() 
DECLARE @DaysToAdd INT
SET @DaysToAdd = 5



DECLARE @Count INT

DECLARE @TotalWeekEnds INT
SET @TotalWeekEnds = 0

DECLARE @Phase INT
SET @Phase = 0


CREATE TABLE #Dates 
(
	Phase INT,
	Date DateTime
)

;WITH CTE(n,Date) AS
(
	SELECT 0 AS n, @Date AS Date
	UNION ALL
	SELECT n+1 AS n, DATEADD(d,n+1, @Date) AS Date
	FROM CTE
	WHERE n < @DaysToAdd
)



INSERT INTO #Dates
SELECT 1, Date FROM CTE


SELECT @TotalWeekEnds = COUNT(*) FROM #Dates 
WHERE (DATENAME(w,Date) = 'Sunday' OR DATENAME(w,Date) = 'Saturday')

WHILE @TotalWeekEnds != 0
BEGIN
	SET @Count = 0
	SELECT @Phase = MAX(Phase) + 1 FROM #Dates
	WHILE @Count < @TotalWeekEnds
	BEGIN
		
		INSERT INTO #Dates
		SELECT @Phase, DATEADD(d,1,MAX(Date)) FROM #Dates

		SET @Count = @Count + 1
	END

	SELECT @TotalWeekEnds = COUNT(*) FROM #Dates 
	WHERE (DATENAME(w,Date) = 'Sunday' OR DATENAME(w,Date) = 'Saturday') AND Phase = @Phase

END


--SELECT * FROM #Dates

SELECT CONVERT(VARCHAR(10),MAX(Date),101) FROM #Dates

DROP TABLE #Dates

[/Edit]
 
Share this answer
 
v2
This is an old post but it might help someone. This query returns the exact days, months and hours between two dates excluded All Sunday(s) and Monday(s):
```
declare @d1 datetime, @d2 datetime
select @d1 = '11/25/2019 12:00:00',  @d2 = '12/02/2019 12:00:00'

SELECT  (DATEDIFF(MINUTE, @d1, @d2) -  DATEDIFF(WK, @d1, @d2) * 2880) + CASE WHEN  DATEDIFF(WK, @d1, @d2) = 1 AND DATEDIFF(DW, @d1, @d2) <= 5 THEN 0 ELSE 1440 END

SELECT (DATEDIFF(HOUR, @d1, @d2) - DATEDIFF(WK, @d1, @d2) * 48) + CASE WHEN  DATEDIFF(WK, @d1, @d2) = 1 AND DATEDIFF(DW, @d1, @d2) <= 5 THEN 0  ELSE 24 END

SELECT (DATEDIFF(DW, @d1, @d2) - DATEDIFF(WK, @d1, @d2) * 2) + CASE WHEN  DATEDIFF(WK, @d1, @d2) = 1 AND DATEDIFF(DW, @d1, @d2) <= 5 THEN 0  ELSE 1 END
```

Or you can use this generic function:

```
CREATE FUNCTION [dbo].[fn_GetBusinnessDaysTimeSpan]( 
 @DateFrom DATETIME,
 @DateTO DATETIME,
 @Type VARCHAR(50)
) 
RETURNS BIGINT
AS 
BEGIN 
		DECLARE @result AS BIGINT;
		IF @Type = 'Min'
		BEGIN
			SET @result = (SELECT  (DATEDIFF(MINUTE, @DateFrom, @DateTO) -  DATEDIFF(WK, @DateFrom, @DateTO) * 2880) + CASE WHEN  DATEDIFF(WK, @DateFrom, @DateTO) = 1 AND (DATEDIFF(DW, @DateFrom, @DateTO)) <= 5 THEN 0 ELSE 1440 END)
		END

		IF @Type = 'Hour'
		BEGIN
			SET @result = (SELECT (DATEDIFF(HOUR, @DateFrom, @DateTO) - DATEDIFF(WK, @DateFrom, @DateTO) * 48) + CASE WHEN  DATEDIFF(WK, @DateFrom, @DateTO) = 1 AND (DATEDIFF(DW, @DateFrom, @DateTO)) <=5 THEN 0  ELSE 24 END)
		END

		IF @Type = 'Day'
		BEGIN
			SET @result = (SELECT (DATEDIFF(DW, @DateFrom, @DateTO) - DATEDIFF(WK, @DateFrom, @DateTO) * 2) + CASE WHEN  DATEDIFF(WK, @DateFrom, @DateTO) = 1 AND (DATEDIFF(DW, @DateFrom, @DateTO)) <=5 THEN 0  ELSE 1 END)
        END
		RETURN @result 
END
```
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900