【问题标题】:What is the T-SQL syntax to associate a specific number to a particular Month?将特定数字与特定月份相关联的 T-SQL 语法是什么?
【发布时间】:2016-04-05 04:23:24
【问题描述】:

我使用的是 SQL Server 2014,我有一个名为“DateDimension”的表,其中包含从 2001 年 1 月 1 日到 2020 年 12 月 31 日的所有日期。

我需要在我的 Power Pivot 模型中使用此表的内容(摘录如下所示)。

Day    Month     Year            Date
1        7       2016     7/1/2016 12.00.00 AM

我的 SQL 查询如下:

SELECT * FROM DateDimension

我需要在查询的输出中添加一个新列(我们称之为“排序”),它将执行以下操作:

如果月 = 1,那么值 = 7

如果月 = 2,那么值 = 8

...

如果月 = 12,那么值 = 6

为简化起见,我将值 1 到 12 与我的财政年度相关联,该财政年度从 7 月开始,到 6 月结束。也就是说,7 月的值为 1,8 月的值为 2....而 6 月的值为 12。

如何将此逻辑添加到我的查询中?

【问题讨论】:

    标签: sql-server tsql date sql-server-2014


    【解决方案1】:

    在 SQL 中,您可以通过以下方式使用 DATEADD 实现它:

    declare @date datetime = '2016-12-01 02:01:01'
    
    select month(dateadd(mm,6,@date)) as [Month]
    

    或者如果你想用 SSRS 表达式来实现它,你可以在下面使用SWITCH

    =SWITCH(Fields!Month.Value = 1, 7,
            Fields!Month.Value = 2, 8,
            Fields!Month.Value = 3, 9,
            and so on...
    )
    

    【讨论】:

      【解决方案2】:

      另一种方式

      DECLARE @month INT = 12
      
      SELECT Isnull(NULLIF(CASE
                             WHEN @month < 6 THEN @month + 6
                             ELSE @month - 6
                           END, 0), 6) 
      

      【讨论】:

        【解决方案3】:

        如果您已经将月份值作为整数,这似乎只是((month+5)%12)+1

        【讨论】:

        • 绝妙的解决方案!谢谢达米安!
        【解决方案4】:

        对于维度表,通常会在表中添加一列或多列来表示这一权利。所以,你会做这样的事情:

        alter table dbo.DateDimension add FiscalMonth tinyint;
        alter table dbo.DateDimension add FiscalYear smallint;
        

        ,相应地填充它,并更改任何关心会计期间的代码以引用 dbo.DateDimension 中的信息。然后,如果(何时!)您的公司更改了您的定义,您只需要更新数据并且代码应该神奇地做正确的事情。

        此外,使用纯代码方法,您只有一个会计年度的概念。这在会计年度的定义发生变化时很重要。现在是七月到六月。但是,假设他们将其切换到 9 月到 8 月。当您使用代码确定财政年度和月份时,它看起来一直都是这样(或者,您需要破解并做一个案例陈述)。使用我在上面详述的数据驱动方法,一切都在数据中,您无需更改任何代码,即可准确了解过去和未来。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-02-14
          • 1970-01-01
          • 1970-01-01
          • 2015-12-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多