General DimDate
DECLARE @StartDate date = DATEFROMPARTS(YEAR(GetDate()),1, 1);
DECLARE @CutoffDate date =DATEFROMPARTS(YEAR(GetDate()), 12, 31) --DATEADD(DAY, -1, DATEADD(YEAR, 1, @StartDate));
SET DATEFIRST 1
;WITH seq(n) AS
(
SELECT 0 UNION ALL SELECT n + 1 FROM seq
WHERE n < DATEDIFF(DAY, @StartDate, @CutoffDate)
),
d(d) AS
(
SELECT DATEADD(DAY, n, @StartDate) FROM seq
),
src AS
(
SELECT
Id =YEAR(d ) *10000 + MONTH (d) *100 + DAY(d) ,
TheDate = CONVERT(date, d),
TheDay = DATEPART(DAY, d),
TheDayName = DATENAME(WEEKDAY, d),
TheWeek = DATEPART(WEEK, d),
TheISOWeek = DATEPART(ISO_WEEK, d),
TheDayOfWeek = DATEPART(WEEKDAY, d) ,
TheMonth = DATEPART(MONTH, d),
TheMonthName = DATENAME(MONTH, d),
TheQuarter = DATEPART(Quarter, d),
TheYear = DATEPART(YEAR, d),
TheFirstOfMonth = DATEFROMPARTS(YEAR(d), MONTH(d), 1),
TheLastOfYear = DATEFROMPARTS(YEAR(d), 12, 31),
TheDayOfYear = DATEPART(DAYOFYEAR, d),
[MonthName] = LEFT(DATENAME(MONTH, d),3),
WeekYear = 'W'+Convert(nvarchar(2),(DATEPART(WEEK,d)) ) +'-'+Convert(nvarchar(4), YEAR(d)) ,
QuarterName ='Q'+CONVERT(nvarchar(2),DATEPART(Quarter, d)),
MonthYear =LEFT(DATENAME(MONTH, d),3) +'-'+Convert(nvarchar(4), YEAR(d)),
QuarterYear ='Q'+CONVERT(nvarchar(2),DATEPART(Quarter, d)) +'-'+Convert(nvarchar(4), YEAR(d)),
WeekStartDate =DATEADD (DAY,1 - DATEPART(WEEKDAY,d),d ),
WeekEndDate =DATEADD (DAY,7 - DATEPART(WEEKDAY,d),d )
FROM d
)
SELECT * FROM src
ORDER BY TheDate
OPTION (MAXRECURSION 0);
Comments
Post a Comment