2016-12-15 45 views
1

我想在像2011年Q4的输出(财务YR-QTR)抵达T-SQL - 财政季度

我可以做到这一点:

CASE -- Results: 2011-Q4 (Financial Yr-Qtr) 
    WHEN MONTH(MyDate) BETWEEN 1 AND 3 THEN concat((YEAR(MyDate) - 1), '-', 'Q4') 
    WHEN MONTH(MyDate) BETWEEN 4 AND 6 THEN concat((YEAR(MyDate) - 1), '-', 'Q1') 
    WHEN MONTH(MyDate) BETWEEN 7 AND 9 THEN concat((YEAR(MyDate) - 0), '-', 'Q2') 
    WHEN MONTH(MyDate) BETWEEN 10 AND 12 THEN concat((YEAR(MyDate) - 0), '-', 'Q3') 
END AS FYrQtr 

但可以在相同的输出来实现没有使用CONCAT? (我只有2008年在工作; CONCAT在2012年抵达)。

谢谢。

+0

'CONCAT('X','Y')'='ISNULL('X','')+ ISNULL('Y',' “)'。也许你可以试试看。另外,你应该养成在将数字连接到字符串之前明确地将数字转换为varchar的习惯 –

+0

更长期的考虑使用日历表来定义你的宿舍(这可能会也可能不适合你的要求) –

+0

在'2012'中,你可以简单地做:'SELECT CONCAT(YEAR(@Date),'-Q',DATEPART(QUARTER,@Date))' – gotqn

回答

2

这种特殊情况下,你可以简单地使用+操作加上一些cast()

CASE -- Results: 2011-Q4 (Financial Yr-Qtr) 
    WHEN MONTH(MyDate) BETWEEN 1 AND 3 THEN cast(YEAR(MyDate) - 1 as char(4)) + '-Q4' 
    WHEN MONTH(MyDate) BETWEEN 4 AND 6 THEN cast(YEAR(MyDate) - 1 as char(4)) + '-Q1' 
    WHEN MONTH(MyDate) BETWEEN 7 AND 9 THEN cast(YEAR(MyDate) - 0 as char(4)) + '-Q2' 
    WHEN MONTH(MyDate) BETWEEN 10 AND 12 THEN cast(YEAR(MyDate) - 0 as char(4)) + '-Q3' 
END FYrQtr 

(但要注意使用cast()功能组成:concat()做隐式转换从int为char类型,而+运算符要求左部分和右部分是字符类型)

+0

虽然我不认为它应该出现在这种情况下,我仍然会尝试在任何并置中处理可能的NULL值。 –

+0

@RaduGheorghiu在这个特定的场景中,有强有力的保证:'+'表达式的左边部分和右边部分不会是'NULL':'MONTH(MyDate)'不是'NULL' '),因此'YEAR(MyDate)'不是'NULL',右边部分是一个常量字符串。对于所提出的解决方案是针对这种特殊情况,还是增加了一些评论。 – xanatos

+0

你是对的,在这种情况下,它不会是一个问题,它更多的是你使用串联的其他场景的建议。 –