2016-12-15 47 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

你是對的,在這種情況下,它不會是一個問題,它更多的是你使用串聯的其他場景的建議。 –