答案 0 :(得分:1)
以您的项目符号列表为例,我假设12/01 / yyyy为财政期间的开头。获得与日期(即GETDATE())相关的财政年度,财政季度等的最佳方法是使用日期维度表。有许多在互联网上创建日期维度表的例子,但大多数人似乎想要一个基于公司的(自定义)财政年度开始和结束时期的表。
下面是一个脚本,它将快速创建一个日期维度表(用于演示目的的临时表),可用于根据来自的日期值查找财务日期值,例如:GETDATE()。日期调暗表基于您自己的财政开始月和日,使用您选择开始的任意年份...脚本使用日期12/01/2017与您今年的季度示例保持一致(目前2017)开始建造桌子。
只需将您的开始日期值(根据您的开始会计月份)添加到变量@MyFiscalDateStart中,然后关闭并运行日期维度表,其中包含任何给定日历的正确会计年度和会计季度数字日期。
IF OBJECT_ID('tempdb..#DimDate') IS NOT NULL
DROP TABLE #DimDate;
DECLARE
@MyFiscalDateStart DATE = '20171201'
, @MyFiscalMonthStart INT
, @OffSet INT;
SET @MyFiscalMonthStart = MONTH(@MyFiscalDateStart);
--SELECT
-- @MyFiscalDateStart
-- , @MyFiscalMonthStart;
SET @OffSet = @MyFiscalMonthStart - 1;
--SELECT
-- @OffSet
;
WITH CTE_DatesTable
AS (
SELECT
MyDate = @MyFiscalDateStart
UNION ALL
SELECT
DATEADD(DAY, 1, MyDate)
FROM
CTE_DatesTable
WHERE DATEADD(DAY, 1, MyDate) < DATEADD(YEAR, 5, @MyFiscalDateStart) -- goes 5 years out, can change number part to suit your needs
)
SELECT
DateKey = MyDate
, CalMonthNumber = DATEPART(MONTH, MyDate)
, FiscalMonthNumber = CASE
WHEN DATEPART(MONTH, MyDate) - @OffSet < 0
THEN (DATEPART(MONTH, MyDate) - @OffSet) + 12
WHEN DATEPART(MONTH, MyDate) - @OffSet = 0
THEN 12
ELSE DATEPART(MONTH, MyDate) - @OffSet
END
, MonthLongName = DATENAME(MONTH, MyDate)
, MonthShortName = SUBSTRING(LTRIM(DATENAME(MONTH, MyDate)), 0, 4)
, CalendarYear = DATEPART(YEAR, MyDate)
, CalQtrNumber = DATENAME(QUARTER, MyDate)
, FYQtrNumber = CASE
WHEN MyDate >= DATEADD(MONTH
, -12
, DATEADD( MONTH
, 13 - CASE
WHEN DATEPART(MONTH, MyDate) - @OffSet < 0
THEN (DATEPART(MONTH, MyDate) - @OffSet) + 12
WHEN DATEPART(MONTH, MyDate) - @OffSet = 0
THEN 12
ELSE DATEPART(MONTH, MyDate) - @OffSet
END
, DATEADD(DAY, 1, EOMONTH(MyDate, -1))
)
)
AND MyDate < DATEADD(MONTH
, 3
, DATEADD(MONTH
, -12
, DATEADD( MONTH
, 13 - CASE
WHEN DATEPART(MONTH, MyDate) - @OffSet < 0
THEN (DATEPART(MONTH, MyDate) - @OffSet) + 12
WHEN DATEPART(MONTH, MyDate) - @OffSet = 0
THEN 12
ELSE DATEPART(MONTH, MyDate) - @OffSet
END
, DATEADD(DAY, 1, EOMONTH(MyDate, -1))
)
)
)
THEN 1
WHEN MyDate >= DATEADD(MONTH
, 3
, DATEADD(MONTH
, -12
, DATEADD( MONTH
, 13 - CASE
WHEN DATEPART(MONTH, MyDate) - @OffSet < 0
THEN (DATEPART(MONTH, MyDate) - @OffSet) + 12
WHEN DATEPART(MONTH, MyDate) - @OffSet = 0
THEN 12
ELSE DATEPART(MONTH, MyDate) - @OffSet
END
, DATEADD(DAY, 1, EOMONTH(MyDate, -1))
)
)
)
AND MyDate < DATEADD(MONTH
, 6
, DATEADD(MONTH
, -12
, DATEADD( MONTH
, 13 - CASE
WHEN DATEPART(MONTH, MyDate) - @OffSet < 0
THEN (DATEPART(MONTH, MyDate) - @OffSet) + 12
WHEN DATEPART(MONTH, MyDate) - @OffSet = 0
THEN 12
ELSE DATEPART(MONTH, MyDate) - @OffSet
END
, DATEADD(DAY, 1, EOMONTH(MyDate, -1))
)
)
)
THEN 2
WHEN MyDate >= DATEADD(MONTH
, 6
, DATEADD(MONTH
, -12
, DATEADD( MONTH
, 13 - CASE
WHEN DATEPART(MONTH, MyDate) - @OffSet < 0
THEN (DATEPART(MONTH, MyDate) - @OffSet) + 12
WHEN DATEPART(MONTH, MyDate) - @OffSet = 0
THEN 12
ELSE DATEPART(MONTH, MyDate) - @OffSet
END
, DATEADD(DAY, 1, EOMONTH(MyDate, -1))
)
)
)
AND MyDate < DATEADD(MONTH
, 9
, DATEADD(MONTH
, -12
, DATEADD( MONTH
, 13 - CASE
WHEN DATEPART(MONTH, MyDate) - @OffSet < 0
THEN (DATEPART(MONTH, MyDate) - @OffSet) + 12
WHEN DATEPART(MONTH, MyDate) - @OffSet = 0
THEN 12
ELSE DATEPART(MONTH, MyDate) - @OffSet
END
, DATEADD(DAY, 1, EOMONTH(MyDate, -1))
)
)
)
THEN 3
WHEN MyDate >= DATEADD(MONTH
, 9
, DATEADD(MONTH
, -12
, DATEADD( MONTH
, 13 - CASE
WHEN DATEPART(MONTH, MyDate) - @OffSet < 0
THEN (DATEPART(MONTH, MyDate) - @OffSet) + 12
WHEN DATEPART(MONTH, MyDate) - @OffSet = 0
THEN 12
ELSE DATEPART(MONTH, MyDate) - @OffSet
END
, DATEADD(DAY, 1, EOMONTH(MyDate, -1))
)
)
)
AND MyDate < DATEADD(MONTH
, 12
, DATEADD(MONTH
, -12
, DATEADD( MONTH
, 13 - CASE
WHEN DATEPART(MONTH, MyDate) - @OffSet < 0
THEN (DATEPART(MONTH, MyDate) - @OffSet) + 12
WHEN DATEPART(MONTH, MyDate) - @OffSet = 0
THEN 12
ELSE DATEPART(MONTH, MyDate) - @OffSet
END
, DATEADD(DAY, 1, EOMONTH(MyDate, -1))
)
)
)
THEN 4
ELSE NULL
END
, FirstDayOfMonth = DATEADD(DAY, 1, EOMONTH(MyDate, -1))
, FYStartDate = DATEADD(MONTH
, -12
, DATEADD( MONTH
, 13 - CASE
WHEN DATEPART(MONTH, MyDate) - @OffSet < 0
THEN (DATEPART(MONTH, MyDate) - @OffSet) + 12
WHEN DATEPART(MONTH, MyDate) - @OffSet = 0
THEN 12
ELSE DATEPART(MONTH, MyDate) - @OffSet
END
, DATEADD(DAY, 1, EOMONTH(MyDate, -1))
)
)
, FYEndDate = EOMONTH(DATEADD( MONTH
, 12 - CASE
WHEN DATEPART(MONTH, MyDate) - @OffSet < 0
THEN (DATEPART(MONTH, MyDate) - @OffSet) + 12
WHEN DATEPART(MONTH, MyDate) - @OffSet = 0
THEN 12
ELSE DATEPART(MONTH, MyDate) - @OffSet
END
, DATEADD(DAY, 1, EOMONTH(MyDate, -1))
)
)
, FiscalYear = YEAR(EOMONTH(DATEADD( MONTH
, 12 - CASE
WHEN DATEPART(MONTH, MyDate) - @OffSet < 0
THEN (DATEPART(MONTH, MyDate) - @OffSet) + 12
WHEN DATEPART(MONTH, MyDate) - @OffSet = 0
THEN 12
ELSE DATEPART(MONTH, MyDate) - @OffSet
END
, DATEADD(DAY, 1, EOMONTH(MyDate, -1))
)
)
)
INTO
#DimDate
FROM
CTE_DatesTable
OPTION (MAXRECURSION 0);
SELECT
dd.DateKey
, dd.CalendarYear
, dd.CalMonthNumber
, dd.CalQtrNumber
, dd.FiscalYear
, dd.FiscalMonthNumber
, dd.FYQtrNumber
, dd.FirstDayOfMonth
, dd.FYStartDate
, dd.FYEndDate
FROM
#DimDate AS dd;
以下是结果的屏幕截图:
我希望这会对你有所帮助。您还可以修改此脚本以包括日期名称,例如星期日,星期一等,并添加所有其他类型的日期关联列,例如假日标志等。