Sql server 将特定数字与特定月份关联的T-SQL语法是什么?

Sql server 将特定数字与特定月份关联的T-SQL语法是什么?,sql-server,tsql,date,sql-server-2014,Sql Server,Tsql,Date,Sql Server 2014,我使用的是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 我需要在查询的输出

我使用的是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
我需要在查询的输出中添加一个新列(我们称之为“排序”),它将执行以下操作:

declare @date datetime = '2016-12-01 02:01:01'

select month(dateadd(mm,6,@date)) as [Month]
=SWITCH(Fields!Month.Value = 1, 7,
        Fields!Month.Value = 2, 8,
        Fields!Month.Value = 3, 9,
        and so on...
)
如果月份=1,则值=7

如果月份=2,则值=8

如果月份=12,则值=6

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


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

在SQL中,您可以使用以下
DATEADD
实现此逻辑:

declare @date datetime = '2016-12-01 02:01:01'

select month(dateadd(mm,6,@date)) as [Month]
=SWITCH(Fields!Month.Value = 1, 7,
        Fields!Month.Value = 2, 8,
        Fields!Month.Value = 3, 9,
        and so on...
)
或者,如果您想使用SSRS表达式实现此功能,可以在以下步骤中使用
SWITCH

declare @date datetime = '2016-12-01 02:01:01'

select month(dateadd(mm,6,@date)) as [Month]
=SWITCH(Fields!Month.Value = 1, 7,
        Fields!Month.Value = 2, 8,
        Fields!Month.Value = 3, 9,
        and so on...
)
另一种方式

DECLARE @month INT = 12

SELECT Isnull(NULLIF(CASE
                       WHEN @month < 6 THEN @month + 6
                       ELSE @month - 6
                     END, 0), 6) 
DECLARE@month INT=12
选择Isnull(NULLIF)(大小写
当@month<6时,则@month+6
第6个月的ELSE
完(0),6)

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

对于维度表,通常会在表中添加一列或多列来表示此权限。因此,您可以执行以下操作:

alter table dbo.DateDimension add FiscalMonth tinyint;
alter table dbo.DateDimension add FiscalYear smallint;
,相应地填充它,并将任何关心会计期间的代码更改为引用dbo.DateDimension中的信息。然后,如果(当!)你的公司改变了定义,你只需要更新数据,代码就会神奇地做正确的事情


此外,使用仅代码的方法,您只有一个会计年度的概念。当会计年度的定义发生变化时,这一点很重要。现在是七月到六月。但假设他们把时间改到九月到八月。当您使用代码确定会计年度和月份时,看起来总是这样(或者,您需要进行黑客攻击并编写案例陈述)。使用上面我详细介绍的数据驱动方法,一切都在数据中,您无需更改任何代码,就可以准确地记录过去和未来。

绝妙的解决方案!谢谢Damien!