Guest User

Untitled

a guest
Dec 17th, 2017
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.25 KB | None | 0 0
  1. DECLARE @StartDate DATE = '20170101', @NumberOfYears INT = 30;
  2.  
  3. -- prevent set or regional settings from interfering with
  4. -- interpretation of dates / literals
  5.  
  6. SET DATEFIRST 7;
  7. SET DATEFORMAT mdy;
  8. SET LANGUAGE US_ENGLISH;
  9.  
  10. DECLARE @CutoffDate DATE = DATEADD(YEAR, @NumberOfYears, @StartDate);
  11.  
  12. -- this is just a holding table for intermediate calculations:
  13.  
  14. CREATE TABLE #dim
  15. (
  16. [date] DATE PRIMARY KEY,
  17. [day] AS DATEPART(DAY, [date]),
  18. [month] AS DATEPART(MONTH, [date]),
  19. FirstOfMonth AS CONVERT(DATE, DATEADD(MONTH, DATEDIFF(MONTH, 0, [date]), 0)),
  20. [MonthName] AS DATENAME(MONTH, [date]),
  21. [week] AS DATEPART(WEEK, [date]),
  22. [ISOweek] AS DATEPART(ISO_WEEK, [date]),
  23. [DayOfWeek] AS DATEPART(WEEKDAY, [date]),
  24. [quarter] AS DATEPART(QUARTER, [date]),
  25. [year] AS DATEPART(YEAR, [date]),
  26. FirstOfYear AS CONVERT(DATE, DATEADD(YEAR, DATEDIFF(YEAR, 0, [date]), 0)),
  27. Style112 AS CONVERT(CHAR(8), [date], 112),
  28. Style101 AS CONVERT(CHAR(10), [date], 101)
  29. );
  30.  
  31. -- use the catalog views to generate as many rows as we need
  32.  
  33. INSERT #dim([date])
  34. SELECT d
  35. FROM
  36. (
  37. SELECT d = DATEADD(DAY, rn - 1, @StartDate)
  38. FROM
  39. (
  40. SELECT TOP (DATEDIFF(DAY, @StartDate, @CutoffDate))
  41. rn = ROW_NUMBER() OVER (ORDER BY s1.[object_id])
  42. FROM sys.all_objects AS s1
  43. CROSS JOIN sys.all_objects AS s2
  44. -- on my system this would support > 5 million days
  45. ORDER BY s1.[object_id]
  46. ) AS x
  47. ) AS y;
  48.  
  49.  
  50. CREATE TABLE dbo.DateDimension
  51. (
  52. DateKey INT NOT NULL PRIMARY KEY,
  53. [Date] DATE NOT NULL,
  54. [Day] TINYINT NOT NULL,
  55. DaySuffix CHAR(2) NOT NULL,
  56. [Weekday] TINYINT NOT NULL,
  57. WeekDayName VARCHAR(10) NOT NULL,
  58. IsWeekend BIT NOT NULL,
  59. IsHoliday BIT NOT NULL,
  60. HolidayText VARCHAR(64) SPARSE,
  61. DOWInMonth TINYINT NOT NULL,
  62. [DayOfYear] SMALLINT NOT NULL,
  63. WeekOfMonth TINYINT NOT NULL,
  64. WeekOfYear TINYINT NOT NULL,
  65. ISOWeekOfYear TINYINT NOT NULL,
  66. [Month] TINYINT NOT NULL,
  67. [MonthName] VARCHAR(10) NOT NULL,
  68. [Quarter] TINYINT NOT NULL,
  69. QuarterName VARCHAR(6) NOT NULL,
  70. [Year] INT NOT NULL,
  71. MMYYYY CHAR(6) NOT NULL,
  72. MonthYear CHAR(7) NOT NULL,
  73. FirstDayOfMonth DATE NOT NULL,
  74. LastDayOfMonth DATE NOT NULL,
  75. FirstDayOfQuarter DATE NOT NULL,
  76. LastDayOfQuarter DATE NOT NULL,
  77. FirstDayOfYear DATE NOT NULL,
  78. LastDayOfYear DATE NOT NULL,
  79. FirstDayOfNextMonth DATE NOT NULL,
  80. FirstDayOfNextYear DATE NOT NULL
  81. );
  82. GO
  83.  
  84. INSERT dbo.DateDimension WITH (TABLOCKX)
  85. SELECT
  86. DateKey = CONVERT(INT, Style112),
  87. [Date] = [date],
  88. [Day] = CONVERT(TINYINT, [day]),
  89. DaySuffix = CONVERT(CHAR(2), CASE WHEN [day] / 10 = 1 THEN 'th' ELSE
  90. CASE RIGHT([day], 1) WHEN '1' THEN 'st' WHEN '2' THEN 'nd'
  91. WHEN '3' THEN 'rd' ELSE 'th' END END),
  92. [Weekday] = CONVERT(TINYINT, [DayOfWeek]),
  93. [WeekDayName] = CONVERT(VARCHAR(10), DATENAME(WEEKDAY, [date])),
  94. [IsWeekend] = CONVERT(BIT, CASE WHEN [DayOfWeek] IN (1,7) THEN 1 ELSE 0 END),
  95. [IsHoliday] = CONVERT(BIT, 0),
  96. HolidayText = CONVERT(VARCHAR(64), NULL),
  97. [DOWInMonth] = CONVERT(TINYINT, ROW_NUMBER() OVER
  98. (PARTITION BY FirstOfMonth, [DayOfWeek] ORDER BY [date])),
  99. [DayOfYear] = CONVERT(SMALLINT, DATEPART(DAYOFYEAR, [date])),
  100. WeekOfMonth = CONVERT(TINYINT, DENSE_RANK() OVER
  101. (PARTITION BY [year], [month] ORDER BY [week])),
  102. WeekOfYear = CONVERT(TINYINT, [week]),
  103. ISOWeekOfYear = CONVERT(TINYINT, ISOWeek),
  104. [Month] = CONVERT(TINYINT, [month]),
  105. [MonthName] = CONVERT(VARCHAR(10), [MonthName]),
  106. [Quarter] = CONVERT(TINYINT, [quarter]),
  107. QuarterName = CONVERT(VARCHAR(6), CASE [quarter] WHEN 1 THEN 'First'
  108. WHEN 2 THEN 'Second' WHEN 3 THEN 'Third' WHEN 4 THEN 'Fourth' END),
  109. [Year] = [year],
  110. MMYYYY = CONVERT(CHAR(6), LEFT(Style101, 2) + LEFT(Style112, 4)),
  111. MonthYear = CONVERT(CHAR(7), LEFT([MonthName], 3) + LEFT(Style112, 4)),
  112. FirstDayOfMonth = FirstOfMonth,
  113. LastDayOfMonth = MAX([date]) OVER (PARTITION BY [year], [month]),
  114. FirstDayOfQuarter = MIN([date]) OVER (PARTITION BY [year], [quarter]),
  115. LastDayOfQuarter = MAX([date]) OVER (PARTITION BY [year], [quarter]),
  116. FirstDayOfYear = FirstOfYear,
  117. LastDayOfYear = MAX([date]) OVER (PARTITION BY [year]),
  118. FirstDayOfNextMonth = DATEADD(MONTH, 1, FirstOfMonth),
  119. FirstDayOfNextYear = DATEADD(YEAR, 1, FirstOfYear)
  120. FROM #dim
  121. OPTION (MAXDOP 1);
  122.  
  123. ;WITH x AS
  124. (
  125. SELECT DateKey, [Date], IsHoliday, HolidayText, FirstDayOfYear,
  126. DOWInMonth, [MonthName], [WeekDayName], [Day],
  127. LastDOWInMonth = ROW_NUMBER() OVER
  128. (
  129. PARTITION BY FirstDayOfMonth, [Weekday]
  130. ORDER BY [Date] DESC
  131. )
  132. FROM dbo.DateDimension
  133. )
  134. UPDATE x SET IsHoliday = 1, HolidayText = CASE
  135. WHEN ([Date] = FirstDayOfYear)
  136. THEN 'New Year''s Day'
  137. WHEN ([DOWInMonth] = 3 AND [MonthName] = 'January' AND [WeekDayName] = 'Monday')
  138. THEN 'Martin Luther King Day' -- (3rd Monday in January)
  139. WHEN ([DOWInMonth] = 3 AND [MonthName] = 'February' AND [WeekDayName] = 'Monday')
  140. THEN 'President''s Day' -- (3rd Monday in February)
  141. WHEN ([LastDOWInMonth] = 1 AND [MonthName] = 'May' AND [WeekDayName] = 'Monday')
  142. THEN 'Memorial Day' -- (last Monday in May)
  143. WHEN ([MonthName] = 'July' AND [Day] = 4)
  144. THEN 'Independence Day' -- (July 4th)
  145. WHEN ([DOWInMonth] = 1 AND [MonthName] = 'September' AND [WeekDayName] = 'Monday')
  146. THEN 'Labour Day' -- (first Monday in September)
  147. WHEN ([DOWInMonth] = 2 AND [MonthName] = 'October' AND [WeekDayName] = 'Monday')
  148. THEN 'Columbus Day' -- Columbus Day (second Monday in October)
  149. WHEN ([MonthName] = 'November' AND [Day] = 11)
  150. THEN 'Veterans'' Day' -- Veterans' Day (November 11th)
  151. WHEN ([DOWInMonth] = 4 AND [MonthName] = 'November' AND [WeekDayName] = 'Thursday')
  152. THEN 'Thanksgiving Day' -- Thanksgiving Day (fourth Thursday in November)
  153. WHEN ([MonthName] = 'December' AND [Day] = 25)
  154. THEN 'Christmas Day'
  155. END
  156. WHERE
  157. ([Date] = FirstDayOfYear)
  158. OR ([DOWInMonth] = 3 AND [MonthName] = 'January' AND [WeekDayName] = 'Monday')
  159. OR ([DOWInMonth] = 3 AND [MonthName] = 'February' AND [WeekDayName] = 'Monday')
  160. OR ([LastDOWInMonth] = 1 AND [MonthName] = 'May' AND [WeekDayName] = 'Monday')
  161. OR ([MonthName] = 'July' AND [Day] = 4)
  162. OR ([DOWInMonth] = 1 AND [MonthName] = 'September' AND [WeekDayName] = 'Monday')
  163. OR ([DOWInMonth] = 2 AND [MonthName] = 'October' AND [WeekDayName] = 'Monday')
  164. OR ([MonthName] = 'November' AND [Day] = 11)
  165. OR ([DOWInMonth] = 4 AND [MonthName] = 'November' AND [WeekDayName] = 'Thursday')
  166. OR ([MonthName] = 'December' AND [Day] = 25);
  167.  
  168. UPDATE d SET IsHoliday = 1, HolidayText = 'Black Friday'
  169. FROM dbo.DateDimension AS d
  170. INNER JOIN
  171. (
  172. SELECT DateKey, [Year], [DayOfYear]
  173. FROM dbo.DateDimension
  174. WHERE HolidayText = 'Thanksgiving Day'
  175. ) AS src
  176. ON d.[Year] = src.[Year]
  177. AND d.[DayOfYear] = src.[DayOfYear] + 1;
Add Comment
Please, Sign In to add comment