2017-05-31 5 views
0

fn_CountWeekDaysと呼ばれるユーザー定義のスカラー関数があり、startdateとenddateの2つのパラメーターを受け取り、整数値を返します。この関数は、基本的に、開始日と終了日の間の平日を計算しません。case文でスカラー関数を使用する

ファンクションコード:

CREATE FUNCTION [dbo].[fn_CountWeekDays] 
(
    @fromdate Datetime, 
    @todate Datetime 

) 
RETURNS INT AS 

Begin 
Declare @NoOfWeekDays int 
Set @NoOfWeekDays = (DATEDIFF(dd, @fromdate, @todate) + 1) 
    -(DATEDIFF(wk, @fromdate, @todate) * 2) 
    -(CASE WHEN DATENAME(dw, @fromdate) = 'Sunday' THEN 1 ELSE 0 END) 
    -(CASE WHEN DATENAME(dw, @todate) = 'Saturday' THEN 1 ELSE 0 END) 

    Return @NoOfWeekDays 
End 

case文で関数を呼び出すと同時に、別の整数値と比較する方法?以下は

は私のクエリです:

select 
Case 
    when Priority in ('1 - Critical','2 - High') and fn_CountWeekDays(Opened,Closed) <= 3 and ProblemState = 'Closed/Resolved' then 1 else 0 
End as RCA_KPI_P1_P2_Met, 
Case 
    when Priority = '3 - Moderate' and fn_CountWeekDays(Opened,Closed) <= 5 and ProblemState = 'Closed/Resolved' then 1 else 0 
End as RCA_KPI_P3_Met 

from v_Problem 
+0

これは動作しませんか? – nimdil

+2

私はこれもうまくいくと思います。パフォーマンスの観点からは、関数をテーブル値関数に書き換えるほうがよいでしょう – HoneyBadger

+0

この場合、テーブル値関数をどのように使用できますか?私は機能コードを含めるように投稿を更新しました。 –

答えて

0

はあなたの関数は、インラインテーブル値関数ではなくスカラー関数ですか?もしそうなら、あなたはとても似cross apply()サブクエリでかでそれを使用する必要があります。

select 
    case 
    when Priority in ('1 - Critical', '2 - High') 
     and w.WeekDays <= 3 
     and ProblemState = 'Closed/Resolved' 
     then 1 
    else 0 
    end as RCA_KPI_P1_P2_Met 
    , case 
    when Priority = '3 - Moderate' 
     and w.WeekDays <= 5 
     and ProblemState = 'Closed/Resolved' 
     then 1 
    else 0 
    end as RCA_KPI_P3_Met 
from v_Problem 
    cross apply tvf_CountWeekDays(Opened,Closed) w 

をあなたの関数は、インラインテーブル値関数ではない場合、あなたはおそらくそうのようなものを書く必要があります。

create function [dbo].[tvf_CountWeekDays] (@fromdate datetime,@todate datetime) 
returns table with schemabinding as return (
    select 
     WeekDays = (datediff(day, @fromdate, @todate) + 1) 
     - (datediff(week, @fromdate, @todate) * 2) 
     - (case when datename(weekday, @fromdate) = 'Sunday' then 1 else 0 end) 
     - (case when datename(weekday, @todate) = 'Saturday' then 1 else 0 end) 
) 
go 

参考:

+0

私の関数はスカラ値です。あなたから提案されたクエリを使用する必要がありますか? –

関連する問題