基于GETDATE()的财政季度开始和结束日期

时间:2017-12-12 15:29:46

标签: sql-server

任何人都可以帮我构建返回当前财政季度的MS SQL公式,如果这些季度是这样的话:

  • 12- 2月
  • 三月至五月
  • 六月至八月
  • 九月至十一月

我已经遇到this article,但这是“常规”季度。

谢谢!

1 个答案:

答案 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;

以下是结果的屏幕截图:

enter image description here

我希望这会对你有所帮助。您还可以修改此脚本以包括日期名称,例如星期日,星期一等,并添加所有其他类型的日期关联列,例如假日标志等。