4

一連の日付を 'Cur. YTD'、'Lst. YTD」、または「その他」。YTD は getdate() に基づいています。タイプDATETIMEの「calendar_date」と呼ばれる単一の列を持つテスト用の一時テーブルがあります。私はこのロジックを思いつきましたが、うまくいくようです。このアプローチがパフォーマンスの観点から理にかなっているのか、それとも他の方法が優れているのか疑問に思っています。

select calendar_date,
case when (MONTH(calendar_date) < MONTH(getdate()))
     or (MONTH(calendar_date) = MONTH (getdate())
         AND DAY(calendar_date) <= DAY(getdate())) then
case when YEAR(calendar_date) = YEAR(GETDATE()) then 'CYTD'
when YEAR(calendar_date) = YEAR(getdate()) - 1 then 'LYTD'
else 'Other'
end
else 'Other'
end as Tim_Tag_YTD
from #temp1
4

2 に答える 2

2

あなたのロジックは見栄えがよく、そのまま機能します。

将来のデータがないことを前提とした、少し単純化する代替案。

select
  calendar_date,
  Tim_Tag_YTD = case DATEDIFF(YEAR, calendar_date, GETDATE())
                when 0 then 'CYTD'
                when 1 then 'LYTD'
                else 'Other'
                end
from #temp1;

あなたのロジックの場合、将来のデータを「その他」に明示的に入れています。これは、次のようにすることもできます。

select
  calendar_date,
  Tim_Tag_YTD = case when calendar_date > GETDATE() then 'Other' else
                    case DATEDIFF(YEAR, calendar_date, GETDATE())
                    when 0 then 'CYTD'
                    when 1 then 'LYTD'
                    else 'Other'
                    end
                end
from #temp1;
于 2013-05-01T21:33:20.763 に答える