【问题标题】:Case Expression Help needed需要案例表达帮助
【发布时间】:2015-03-27 15:42:09
【问题描述】:

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 支付日期 11/30/2014 将是 FSY2015Q1

但是如果我有记录,那么让我们说 ItemID 1 Servdate 9/01/2014 Paid Date 12/30/2014 我需要它说'NQ'那是我失败的地方......

有人可以帮我吗?

【问题讨论】:

标签: sql sql-server tsql case


【解决方案1】:

这是你想要的吗?

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

month() 返回月份。这只是查找季度值,我认为从一月份的第二季度开始。

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

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

【讨论】:

  • 更多这样的。 Q1 开始于 09/01 到 11/30select (month(getdate ()) ) 'Q3', 'Q3', 'Q3', 'Q4', 'Q4', 'Q4', 'Q2', 'Q2', 'Q2'、'Q1'、'Q1'、'Q1'
【解决方案2】:

只需将日期偏移适当的月数即可。您的要求的核心是这个表达式:

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

要获得您要查找的确切文本,只需使用季度数字来驱动大小写表达式。日期组件也可以计算,但我觉得硬编码不值得麻烦:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-13
    • 2012-11-30
    • 2019-01-31
    • 2011-05-09
    • 2023-03-19
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    相关资源
    最近更新 更多