1

現在のシステム日付に基づいて日付の範囲をフィルター処理する case ステートメントを作成しようとしています。システムの日付に基づいて、30 日前から現在、30 ~ 60 日前、および 60 ~ 120 日前までの範囲が必要です。これは私がこれまでのところ失敗したことを証明しているものです:

(case 
 when a.last_active_date between sysdate and sysdate-30 then 'Inactive 30 Days or Less'
 when a.last_active_date between sysdate-30 and sysdate-60 then 'Inactive 30-60' 
 when a.last_active_date between sysdate-60 and  sysdate - 120 then 'Inactive 60-120' 
 else 'Inactive 120+ Days'
 end) Inactivity,

これにどのようにアプローチすべきかについての提案はありますか?

4

1 に答える 1

1

PL-SQL のソリューションは次のとおりです: DB Fiddle Example

-- select based on runtime calculation
select a.last_active_date
,   case 
        when (sysdate - a.last_active_date) <= 30 then 'Inactive 30 Days or Less'
        when (sysdate - a.last_active_date) <= 60 then 'Inactive 30-60' 
        when (sysdate - a.last_active_date) <= 120 then 'Inactive 60-120' 
        else 'Inactive 120+ Days'
 end Inactivity
from demo a
order by a.last_active_date desc

これがT-SQLの答えです:DB Fiddle Example

select a.last_active_date
,   case 
        when getutcdate() - a.last_active_date <= 30 then 'Inactive 30 Days or Less'
        when getutcdate() - a.last_active_date <= 60 then 'Inactive 30-60' 
        when getutcdate() - a.last_active_date <= 120 then 'Inactive 60-120' 
        else 'Inactive 120+ Days'
 end Inactivity
from @t a
order by a.last_active_date desc

テストデータを使用して上記の例をセットアップするコードは次のとおりです。

declare @t table (last_active_date datetime)

insert @t select getutcdate()
union select getutcdate()-29
union select getutcdate()-30
union select getutcdate()-31
union select getutcdate()-59
union select getutcdate()-60
union select getutcdate()-61
union select getutcdate()-119
union select getutcdate()-120
union select getutcdate()-121

これの利点は、getutcdate() - a.last_active_date関数の再利用により結果のキャッシュが可能になるため、計算のオーバーヘッドがいくらか節約されることです。

于 2012-11-20T21:15:29.173 に答える