【发布时间】:2017-12-12 15:29:45
【问题描述】:
如果季度如下所示,谁能帮我构建返回当前财政季度的 MS SQL 公式:
- 12 月至 2 月
- 3 月至 5 月
- 6-8 月
- 9 月至 11 月
我已经遇到过this article,但它是针对“常规”宿舍的。
谢谢!
【问题讨论】:
标签: sql-server
如果季度如下所示,谁能帮我构建返回当前财政季度的 MS SQL 公式:
我已经遇到过this article,但它是针对“常规”宿舍的。
谢谢!
【问题讨论】:
标签: sql-server
以您的季度项目符号列表为例,我假设 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;
这是结果的屏幕截图:
我希望这对你有帮助。您还可以修改此脚本以包含星期天、星期一等日期名称,并添加所有其他类型的日期相关列,例如节日标志等。
【讨论】: