2016-03-08 15:28:00

This script creates a dbo.Holiday table and a scalar function designed to return the number of business days between two dates.

-- Create the Holiday Table is not present.
IF NOT EXISTS ( SELECT 1
                FROM sys.Objects
                WHERE Name = 'Holiday')
BEGIN
    CREATE TABLE dbo.Holiday (
           Id          INT NOT NULL,
           [Date]      DATETIME NOT NULL,
           Description NVARCHAR(50) NOT NULL
    ) ON [PRIMARY]
END
GO

--DELETE the existing script.
IF EXISTS (SELECT 1 
           FROM sys.objects
           WHERE  object_id = OBJECT_ID(N'dbo.f_CountBusinessDaysBetweenDates'))
    DROP PROCEDURE dbo.f_CountBusinessDaysBetweenDates
GO

CREATE FUNCTION [dbo].[f_CountBusinessDaysBetweenDates]
    (@StartDate DATETIME, 
     @EndDate   DATETIME)
RETURNS INT
AS
BEGIN
    DECLARE @Days INT

    -- Get total working days (all days excluding Saturday and Sunday)
    SELECT @Days =  DATEDIFF(day, @StartDate, @EndDate ) _p_l_u_s_ 1
                    - ( 2 * DATEDIFF( week, @StartDate, @EndDate ) )
                    _p_l_u_s_ CASE WHEN DATENAME( dw, @StartDate) = 'Saturday'
                           THEN 1 ELSE 0 END
                    - CASE WHEN DATENAME( dw, @EndDate) = 'Saturday'
                           THEN 1 ELSE 0 END 

    -- Remove the holiday days
    SELECT  @Days = @Days - COUNT(*) 
    FROM Holiday
    WHERE [Date] BETWEEN @StartDate _p_l_u_s_ 1 AND @EndDate 
    
    -- Return results
    return @Days
END
GO
Copyright © 2025 delaney. All rights reserved.