簡體   English   中英

需要案例表達幫助

[英]Case Expression Help needed

 DECLARE @ServDate DATE = '01/04/2013', @PaidDate DATE = '01/25/2013' SELECT @ServDate AS DATE ,@PaidDate AS PaidDate , CASE WHEN (MONTH(@ServDate) IN (9,10,11) AND MONTH(@PaidDate) IN (9,10,11) AND YEAR(@ServDate) = YEAR(@PaidDate)) AND (convert(CHAR(4), YEAR(@ServDate)) = convert(CHAR(4), YEAR(@PaidDate))) THEN 'FSY' + ''+ convert(CHAR(4), YEAR(@ServDate) + 1) + '-' + 'Q1' WHEN (MONTH(@ServDate) IN (12,1,2) AND MONTH(@PaidDate) IN (12,1,2) AND YEAR(@ServDate) = YEAR(@PaidDate)) AND ( (convert(CHAR(4), YEAR(@ServDate) + 1) = convert(CHAR(4), YEAR(@PaidDate))) OR (convert(CHAR(4), YEAR(@ServDate)) = convert(CHAR(4), YEAR(@PaidDate))) ) THEN 'FSY' + ''+ CASE WHEN (MONTH(@ServDate) IN (1,2) AND MONTH(@PaidDate) IN (1,2)) AND (convert(CHAR(4), YEAR(@ServDate)) = convert(CHAR(4), YEAR(@PaidDate))) THEN convert(CHAR(4), YEAR(@ServDate) - 0) + '-' + 'Q2' ELSE convert(CHAR(4), YEAR(@ServDate) + 1) + '-' + 'Q2' END WHEN (MONTH(@ServDate) IN (3,4,5) AND MONTH(@PaidDate) IN (3,4,5) AND YEAR(@ServDate) = YEAR(@PaidDate)) AND (convert(CHAR(4), YEAR(@ServDate)) = convert(CHAR(4), YEAR(@PaidDate))) THEN 'FSY' + ''+ convert(CHAR(4), YEAR(@ServDate) - 0)+ ' - '+ 'Q3' WHEN (MONTH(@ServDate) IN (6,7,8) AND MONTH(@PaidDate) IN (6,7,8) AND YEAR(@ServDate) = YEAR(@PaidDate)) AND (convert(CHAR(4), YEAR(@ServDate)) = convert(CHAR(4), YEAR(@PaidDate))) THEN 'FSY' + ''+ convert(CHAR(4), YEAR(@ServDate) - 0) + ' - ' + 'Q4' ELSE 'NQ' END AS Quarter 

我必須寫一個case表達式來確定哪個季度日期也應屬於。

我們公司的季度從第一季度開始:ServDate = 9/01/2014和11/30/2014 Piad日期9/1/2014和11/30/2014將是FSY2015Q1

季度將填充如下:

Q1 - DOS 9/1 to 11/30
Q1 - Paid 9/1 to 11/30
Q2 - DOS 9/1 to 2/28
Q2 - Paid 9/1 to 2/28
Q3 - DOS 9/1 to 5/31
Q3 - Paid 9/1 to 5/31
Q4 - DOS 9/1 to 8/31
Q4 - Paid 9/1 to 8/31

因此,假設ItemID 1 Servdate 9/01/2014 Paid Date 11/30/2014將為FSY2015Q1

但是,如果我有記錄,那么可以說ItemID 1 Servdate 9/01/2014 Paid Date 12/30/2014我要說'NQ'就是我失敗的地方。...

有人能幫我嗎 ?

這是您想要的嗎?

select choose(month(date), 'Q2', 'Q2', 'Q2', 'Q3', 'Q3', 'Q3, 'Q4', 'Q4', 'Q4', 'Q1', 'Q1', 'Q1')

month()返回月份。 這只是查找季度價值,我認為從一月的第二季度開始。

注意:select choose()在SQL Server 2012+中可用。 在早期版本中,您可以使用case語句執行相同的操作:

select (case month(date) when 1 then 'Q2'
                         when 2 then 'Q2'
         . . .
         end) as quarter

只需將日期偏移適當的月份數即可。 您的要求的核心是以下表達式:

'Q' + cast(datepart(qq, dateadd(mm, -4, <DATE>)) as char(1))

要獲取您要查找的確切文本,只需使用四分之一數字來驅動一個case表達式。 日期分量也可以計算出來,但是我覺得在進行硬編碼時確實不值得為此付出麻煩:

case datepart(qq, dateadd(mm, -4, <DATE>)
    when 1 then 'Q1 ...'
    when 2 then 'Q2 ...'
    when 3 then 'Q3 ...'
    when 4 then 'Q4 ...'
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM