| 
	 
		
 D 
	 
		
dlangham author
	 
		
Not sure if this SQL Script is of use to anyone with the Calendar Template or not as I haven't yet implemented it.
  This is a SQL Server Script that will create a table with the following: All Days as per settings (Currently 1st Jan 2008 to 31st Dec 2020)
  Easter Holidays
  Bank Holidays
  Christmas Holidays
  New Year Holidays
  Weekends and Work Days These are based on UK Holidays but the script could easilly be changed to reflect any countries holidays.
  SET DATEFIRST 1
  SET NOCOUNT ON
  GO --Create Week Number Function
  CREATE FUNCTION WeekNumber (@DATE datetime)
  RETURNS int
  AS
  BEGIN
   DECLARE @WeekNumber int
   SET @WeekNumber= DATEPART(wk,@DATE)+1
   -DATEPART(wk,CAST(DATEPART(yy,@DATE) as CHAR(4))+'0104')
  --Special cases: Jan 1-3 may belong to the previous year
   IF (@WeekNumber=0) 
   SET @WeekNumber=dbo.WeekNumber(CAST(DATEPART(yy,@DATE)-1 
   AS CHAR(4))+'12'+ CAST(24+DATEPART(DAY,@DATE) AS CHAR(2)))+1
  --Special case: Dec 29-31 may belong to the next year
   IF ((DATEPART(mm,@DATE)=12) AND 
   ((DATEPART(dd,@DATE)-DATEPART(dw,@DATE))>= 28))
   SET @WeekNumber=1
   RETURN(@WeekNumber)
  END
  GO --CREATE Easter Date function 
  CREATE FUNCTION fnDLA_GetEasterdate(@year INT)
  RETURNS CHAR (8)
  AS
  BEGIN 
   DECLARE @A INT,@B INT,@C INT,@D INT,@E INT,@F INT,@G INT,
   @H INT,@I INT,@K INT,@L INT,@M INT,@O INT,@R INT 
   
   SET @A = @YEAR%19
   SET @B = @YEAR / 100
   SET @C = @YEAR%100
   SET @D = @B / 4
   SET @E = @B%4
   SET @F = (@B + 8) / 25
   SET @G = (@B - @F + 1) / 3
   SET @H = ( 19 * @A + @B - @D - @G + 15)%30
   SET @I = @C / 4
   SET @K = @C%4
   SET @L = (32 + 2 * @E + 2 * @I - @H - @K)%7
   SET @M = (@A + 11 * @H + 22 * @L) / 451
   SET @O = 22 + @H + @L - 7 * @M  IF @O > 31
   BEGIN
   SET @R = @O - 31 + 400 + @YEAR * 10000
   END
   ELSE
   BEGIN
   SET @R = @O + 300 + @YEAR * 10000
   END 
   RETURN @R
  END
  GO --Create Holiday_Dates table
  CREATE TABLE Holiday_Dates
  (
  FullDate datetime NOT NULL CONSTRAINT PK_FullDate PRIMARY KEY CLUSTERED, 
  Period int, 
  WeekNumber int, 
  DayDescription varchar(50) CONSTRAINT DF_Holiday_Dates_WorkDay DEFAULT 'Working Day'
  )
  GO --Populate table with required dates
  DECLARE @DateFrom datetime, @DateTo datetime, @Period int
  SET @DateFrom = CONVERT(datetime,'20080101') --yyyymmdd (1st Jan 2008) amend as required
  SET @DateTo = CONVERT(datetime,'20201231') --yyyymmdd (31st Dec 2020) amend as required
  WHILE @DateFrom <= @DateTo
  BEGIN
   SET @Period = CONVERT(int,LEFT(CONVERT(varchar(10),@DateFrom,112),6))
   INSERT Holiday_Dates(FullDate, Period, WeekNumber)
   SELECT @DateFrom, @Period, dbo.WeekNumber(@DateFrom)
   SET @DateFrom = DATEADD(dd,+1,@DateFrom)
  END
  GO --Start of DayDescriptions UPDATE
  ---------------------------------------WEEKENDS--------------------------------------
  UPDATE Holiday_Dates
  SET DayDescription = 'Weekend'
  WHERE DATEPART(dw,FullDate) IN (6,7)
  GO
  --------------------------------EASTER---------------------------------------------
  UPDATE Holiday_Dates
  SET DayDescription = 'Good Friday'
  WHERE FullDate = DATEADD(dd,-2,CONVERT(datetime,dbo.fnDLA_GetEasterdate(DATEPART(yy,FullDate))))
  UPDATE Holiday_Dates
  SET DayDescription = 'Easter Monday'
   WHERE FullDate = DATEADD(dd,+1,CONVERT(datetime,dbo.fnDLA_GetEasterdate(DATEPART(yy,FullDate))))
  GO
  --------------------------------NEW YEAR-------------------------------------------
  UPDATE Holiday_Dates
  SET DayDescription = 'New Year Bank Holiday'
  WHERE FullDate IN (SELECT CASE WHEN DATEPART(dw,FullDate) IN (6,7) THEN
   DATEADD(dd,+2,FullDate) ELSE FullDate END
   FROM Holiday_Dates 
   WHERE DATEPART(mm,FullDate) = 1 AND DATEPART(dd,FullDate) IN (1))
  GO
  UPDATE Holiday_Dates
  SET DayDescription = 'New Years Eve'  FROM Holiday_Dates 
   WHERE DATEPART(mm,FullDate) = 12 AND DATEPART(dd,FullDate) IN (31)
  GO
  UPDATE Holiday_Dates
  SET DayDescription = 'New Years Day'  FROM Holiday_Dates 
   WHERE DATEPART(mm,FullDate) = 1 AND DATEPART(dd,FullDate) IN (1)
  GO
  ---------------------MAY BANK HOLIDAYS(Always Monday)------------------------------
  UPDATE Holiday_Dates
  SET DayDescription = 'May Bank Holiday'
   WHERE FullDate IN (SELECT MIN(FullDate) FROM Holiday_Dates 
   WHERE DATEPART(mm,FullDate) = 5 AND DATEPART(dw,FullDate) = 1
   GROUP BY DATEPART(yy,FullDate))
   OR FullDate IN (SELECT MAX(FullDate) FROM Holiday_Dates 
   WHERE DATEPART(mm,FullDate) = 5 AND DATEPART(dw,FullDate) = 1
   GROUP BY DATEPART(yy,FullDate))
  GO
  --------------------AUGUST BANK HOLIDAY(Always Monday)------------------------------
  UPDATE Holiday_Dates
  SET DayDescription = 'August Bank Holiday'
   WHERE FullDate IN (SELECT MAX(FullDate) FROM Holiday_Dates 
   WHERE DATEPART(mm,FullDate) = 8 AND DATEPART(dw,FullDate) = 1
   GROUP BY DATEPART(yy,FullDate))
  GO
  --------------------XMAS(Create Holiday on next working day if on Sat/Sun)--------------------
  UPDATE Holiday_Dates
  SET DayDescription = 'Christmas Bank Holiday'
  WHERE FullDate IN (SELECT CASE WHEN DATEPART(dw,FullDate) IN (6,7) THEN
   DATEADD(dd,+2,FullDate) ELSE FullDate END
   FROM Holiday_Dates 
   WHERE DATEPART(mm,FullDate) = 12 AND DATEPART(dd,FullDate) IN (25,26))
  GO
  UPDATE Holiday_Dates
  SET DayDescription = 'Christmas Eve'  FROM Holiday_Dates 
   WHERE DATEPART(mm,FullDate) = 12 AND DATEPART(dd,FullDate) IN (24)
  GO
  UPDATE Holiday_Dates
  SET DayDescription = 'Christmas Day'  FROM Holiday_Dates 
   WHERE DATEPART(mm,FullDate) = 12 AND DATEPART(dd,FullDate) IN (25)
  GO
  UPDATE Holiday_Dates
  SET DayDescription = 'Boxing Day'  FROM Holiday_Dates 
   WHERE DATEPART(mm,FullDate) = 12 AND DATEPART(dd,FullDate) IN (26)
  GO
  --------------------Clean Up--------------------
  DROP FUNCTION fnDLA_GetEasterdate
  DROP FUNCTION WeekNumber SET NOCOUNT OFF 
	
	 | 
	
									
	
	 
		
	
	 | 
	
									
	
	 
		
	 
		
	
	 |