【问题标题】:Fiscal Quarter start and end dates based on GETDATE()基于 GETDATE() 的财政季度开始和结束日期
【发布时间】:2017-12-12 15:29:45
【问题描述】:

如果季度如下所示,谁能帮我构建返回当前财政季度的 MS SQL 公式:

  • 12 月至 2 月
  • 3 月至 5 月
  • 6-8 月
  • 9 月至 11 月

我已经遇到过this article,但它是针对“常规”宿舍的。

谢谢!

【问题讨论】:

标签: sql-server


【解决方案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;

这是结果的屏幕截图:

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

【讨论】:

  • 这看起来真的很酷!谢了哥们!我马上就测试一下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-07
相关资源
最近更新 更多