将特定数字与特定月份相关联的 T-SQL 语法是什么?
What is the T-SQL syntax to associate a specific number to a particular Month?
我正在使用 SQL Server 2014,我有一个名为 "DateDimension" 的 table,其中包含从 2001 年 1 月 1 日到 2020 年 12 月 31 日的所有日期。
我需要在我的 Power Pivot 模型中使用此 table 的内容(摘录如下所示)。
Day Month Year Date
1 7 2016 7/1/2016 12.00.00 AM
我的SQL查询如下:
SELECT * FROM DateDimension
我需要在查询的输出中添加一个新列(我们称之为 "Sorting"),它将执行以下操作:
如果月 = 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]
或者,如果你想用 SSRS 表达式实现它,你可以在下面使用 SWITCH
:
=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)
如果您已经将月份值作为整数,这似乎只是 ((month+5)%12)+1
。
对于维度 table,通常会在 table 中添加一列或多列来表示此权利。所以,你会做这样的事情:
alter table dbo.DateDimension add FiscalMonth tinyint;
alter table dbo.DateDimension add FiscalYear smallint;
,相应地填充它,并更改任何关心会计期间的代码以引用 dbo.DateDimension 中的信息。然后,如果(什么时候!)你的公司改变了你的定义,你只需要更新数据,代码就会神奇地做正确的事情。
此外,使用 code-only 方法,您只有一个会计年度概念。这在会计年度的定义发生变化的情况下很重要。现在是七月到六月。但是假设他们将其切换到 9 月到 8 月。当您使用代码确定财政年度和月份时,它看起来就像一直那样(或者,您需要破解并做一个案例陈述)。使用我在上面详述的数据驱动方法,一切都在数据中,您无需更改任何代码,您就可以准确了解过去和未来。
我正在使用 SQL Server 2014,我有一个名为 "DateDimension" 的 table,其中包含从 2001 年 1 月 1 日到 2020 年 12 月 31 日的所有日期。
我需要在我的 Power Pivot 模型中使用此 table 的内容(摘录如下所示)。
Day Month Year Date
1 7 2016 7/1/2016 12.00.00 AM
我的SQL查询如下:
SELECT * FROM DateDimension
我需要在查询的输出中添加一个新列(我们称之为 "Sorting"),它将执行以下操作:
如果月 = 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]
或者,如果你想用 SSRS 表达式实现它,你可以在下面使用 SWITCH
:
=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)
如果您已经将月份值作为整数,这似乎只是 ((month+5)%12)+1
。
对于维度 table,通常会在 table 中添加一列或多列来表示此权利。所以,你会做这样的事情:
alter table dbo.DateDimension add FiscalMonth tinyint;
alter table dbo.DateDimension add FiscalYear smallint;
,相应地填充它,并更改任何关心会计期间的代码以引用 dbo.DateDimension 中的信息。然后,如果(什么时候!)你的公司改变了你的定义,你只需要更新数据,代码就会神奇地做正确的事情。
此外,使用 code-only 方法,您只有一个会计年度概念。这在会计年度的定义发生变化的情况下很重要。现在是七月到六月。但是假设他们将其切换到 9 月到 8 月。当您使用代码确定财政年度和月份时,它看起来就像一直那样(或者,您需要破解并做一个案例陈述)。使用我在上面详述的数据驱动方法,一切都在数据中,您无需更改任何代码,您就可以准确了解过去和未来。