• I had the idea of populating the Holiday table myself this morning. I found a function to calculate the date for Easter on this page:

    http://www.databasejournal.com/scripts/article.php/3469911

    Then I used that along with Peter's seqDates function to create the following SP. Covers all UK Holidays, and if New Year, Christmas or Boxing Day occur at the weekend it inserts the appropriate Monday/Tuesday into the table.

    CREATE PROCEDURE GenerateHolidays (@yr SMALLINT)

    AS

    DECLARE @tmpdatec VARCHAR(10)

    DECLARE @tmpdate SMALLDATETIME

    DECLARE @tmpdesc VARCHAR(50)

    DECLARE @sdate   VARCHAR(10)

    DECLARE @edate   VARCHAR(10)

    SET @tmpdatec = '01/01/' + CAST(@yr AS VARCHAR)

    SET @tmpdate = CAST(@tmpdatec AS SMALLDATETIME)

    IF DATEPART(dw, @tmpdate) = 7 SELECT @tmpdate = DATEADD(DAY, 1, @tmpdate)

    IF DATEPART(dw, @tmpdate) = 1 SELECT @tmpdate = DATEADD(DAY, 1, @tmpdate)

    SET @tmpdesc = 'New Year''s Day'

    INSERT INTO Holidays VALUES (@tmpdate, @tmpdesc)

    SELECT @tmpdate = dbo.fnYear2Easter(@yr)

    SELECT @tmpdate = DATEADD(DAY, -2, @tmpdate)

    SELECT @tmpdesc = 'Good Friday'

    INSERT INTO Holidays VALUES (@tmpdate, @tmpdesc)

    SELECT @tmpdate = DATEADD(DAY, 3, @tmpdate)

    SELECT @tmpdesc = 'Easter Monday'

    INSERT INTO Holidays VALUES (@tmpdate, @tmpdesc)

    SET @sdate = '05/01/' + CAST(@yr AS VARCHAR)

    SET @edate = '05/31/' + CAST(@yr AS VARCHAR)

    SELECT @tmpdate = MIN(dt.SeqDate) FROM dbo.fnSeqDates(@sdate, @edate) dt WHERE DATEPART(dw, dt.SeqDate) = 2

    SET @tmpdesc = 'May Day Bank Holiday'

    INSERT INTO Holidays VALUES (@tmpdate, @tmpdesc)

    SELECT @tmpdate = MAX(dt.SeqDate) FROM dbo.fnSeqDates(@sdate, @edate) dt WHERE DATEPART(dw, dt.SeqDate) = 2

    SET @tmpdesc = 'Spring Bank Holiday'

    INSERT INTO Holidays VALUES (@tmpdate, @tmpdesc)

    SET @sdate = '08/01/' + CAST(@yr AS VARCHAR)

    SET @edate = '08/31/' + CAST(@yr AS VARCHAR)

    SELECT @tmpdate = MAX(dt.SeqDate) FROM dbo.fnSeqDates(@sdate, @edate) dt WHERE DATEPART(dw, dt.SeqDate) = 2

    SET @tmpdesc = 'August Bank Holiday'

    INSERT INTO Holidays VALUES (@tmpdate, @tmpdesc)

    SET @tmpdatec = '12/25/' + CAST(@yr AS VARCHAR)

    SET @tmpdate = CAST(@tmpdatec AS SMALLDATETIME)

    IF DATEPART(dw, @tmpdate) = 7 SELECT @tmpdate = DATEADD(DAY, 1, @tmpdate)

    IF DATEPART(dw, @tmpdate) = 1 SELECT @tmpdate = DATEADD(DAY, 1, @tmpdate)

    SET @tmpdesc = 'Christmas Day'

    INSERT INTO Holidays VALUES (@tmpdate, @tmpdesc)

    SET @tmpdatec = '12/26/' + CAST(@yr AS VARCHAR)

    SET @tmpdate = CAST(@tmpdatec AS SMALLDATETIME)

    IF DATEPART(dw, @tmpdate) = 7 SELECT @tmpdate = DATEADD(DAY, 2, @tmpdate)

    IF DATEPART(dw, @tmpdate) = 1 SELECT @tmpdate = DATEADD(DAY, 2, @tmpdate)

    SET @tmpdesc = 'Boxing Day'

    INSERT INTO Holidays VALUES (@tmpdate, @tmpdesc)