I need to find hours between 2 dates excluding weekends. How to do it in MS SQL Server?
I have tried this,
CAST(( GETDATE() - [approval_date]) AS FLOAT) * 24.0 AS WorkedHours,
its including weekends.
I need to find hours between 2 dates excluding weekends. How to do it in MS SQL Server?
I have tried this,
CAST(( GETDATE() - [approval_date]) AS FLOAT) * 24.0 AS WorkedHours,
its including weekends.
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 Saturday(s):
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
WHEN DATEDIFF(WK, @d1, @d2) = 0 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
WHEN DATEDIFF(WK, @d1, @d2) = 0 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
WHEN DATEDIFF(WK, @d1, @d2) = 0 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
WHEN DATEDIFF(WK, @DateFrom, @DateTO) = 0 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
WHEN DATEDIFF(WK, @DateFrom, @DateTO) = 0 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
WHEN DATEDIFF(WK, @DateFrom, @DateTO) = 0 THEN 0
ELSE 1 END
)
END
RETURN @result
END
Unfortunately this was not as straight forward as I thought it was going to be.
I took this blog/tutorial as a base and started working from there.
This is the scalar function I am now using. I did some smoke testing and it seems to work just fine. If you see any errors please let me know so I can test and update the solutio as necessary. I hope this helps others!
ALTER FUNCTION [dbo].[GetWeekDayHoursDiff](@DateFrom datetime, @DateTo datetime)
RETURNS INT
AS
BEGIN
IF @DateFrom > @DateTo
BEGIN
return CAST('DateFrom cannot be lower thant DateTo parameters' as int); -- https://www.youtube.com/watch?v=2ZIpFytCSVc
END
DECLARE @TotHours INT= DATEDIFF(Hour, @DateFrom, @DateTo);
DECLARE @TotWeekHours INT= DATEDIFF(WEEK, @DateFrom, @DateTo) * 48;
DECLARE @SundayOffset INT= CASE
WHEN DATENAME(WEEKDAY, @DateFrom) = 'Sunday' THEN 24 - DATEPART(HOUR, @DateFrom)
WHEN DATENAME(WEEKDAY, @DateFrom) = 'Saturday' THEN - (DATEPART(HOUR, @DateFrom))
ELSE 0
END;
DECLARE @SaturdayOffset INT= CASE
WHEN DATENAME(WEEKDAY, @DateTo) = 'Saturday' THEN - DATEPART(HOUR, @DateTo)
WHEN DATENAME(WEEKDAY, @DateTo) = 'Sunday' THEN - DATEPART(HOUR, @DateTo) + 24
ELSE 0
END;
DECLARE @TotWorkingHours INT= @TotHours - @TotWeekHours - @SundayOffset + @SaturdayOffset;
-- select @TotWorkingHours TotWorkingHours
-- , @TotHours TotHours
--, @TotWeekHours TotWWeekHours
--, @SundayOffset SundayOffset
--, @SaturdayOffset SaturdayOffset
RETURN @TotWorkingHours
END
Try this
select datediff(hh, @d1, @d2)
where @d1 = date1 and @d2 = date2
In your case it would be like this
select datediff(hh, GETDATE(), [approval_date])
Based on get DATEDIFF excluding weekends using sql server, follow this query to get the hours
SELECT DATEDIFF(HH, @date1, @date2) - (DATEDIFF(WK, @date1, @date2) * 2) -
CASE WHEN datepart(DW, @d1) = 1 THEN 24 ELSE 0 END +
CASE WHEN datepart(DW, @d2) = 1 THEN 24 ELSE 0 END