2016-10-06 5 views
0

地域と夏の節約に基づいてオフセットを計算する必要があります。これは5つの日付フィールドで行う必要があります。したがって、LEFT JOIN関数を作成し、日付フィールドをパラメータとして提供すると、パフォーマンスの面で優れていますか?与えられた日付のオフセット値を効率的に取得する方法

コードサンプル:あなたはスカラー関数を作成する場合は

SELECT 
    ModifiedDate   = DATEADD (hh,ISNULL(DateModified.DateDateOffsetNumber, 0),T.ModifiedDate)   
    ,CreatedDate   = DATEADD (hh,ISNULL(DateCreated.DateDateOffsetNumber, 0),T.CreatedDate)  
    ,ReceivedDateTime  = DATEADD (hh,ISNULL(DateReceived.DateDateOffsetNumber, 0),T.ReceivedDateTime) 
    ,ResolvedDate   = DATEADD (hh,ISNULL(DateResolved.DateDateOffsetNumber, 0),T.ResolvedDate) 
    ,ReactivatedDateTime = DATEADD (hh,ISNULL(DateReactivated.DateDateOffsetNumber, 0),T.ReactivatedDateTime) 
FROM TableA T 
LEFT OUTER JOIN DateOffset DateModified ON T.ModifiedDate BETWEEN DateModified.DateStartDate AND DateModified.DateEndDate 
LEFT OUTER JOIN DateOffset DateCreated ON T.CreatedDate BETWEEN DateCreated.DateStartDate AND DateCreated.DateEndDate 
LEFT OUTER JOIN DateOffset DateReceived ON T.ReceivedDateTime BETWEEN DateReceived.DateStartDate AND DateReceived.DateEndDate 
LEFT OUTER JOIN DateOffset DateResolved ON T.ResolvedDate BETWEEN DateResolved.DateStartDate AND DateResolved.DateEndDate 
LEFT OUTER JOIN DateOffset DateReactivated ON T.ReactivatedDateTime BETWEEN DateReactivated.DateStartDate AND DateReactivated.DateEndDate 
+0

このクエリは、どんな意味がありません。 DateReceivedを参照していますが、そのテーブルまたはエイリアスはここにはありません。ここでは別名DateResolvedを2回使用すると動作しません。それにかかわらず、関数は逆の効果を持ちます。 –

+0

私は適切なエイリアスを提供しました –

答えて

1

、パフォーマンスが悪くなります。

あなたはインライン関数を作成する場合は、あなたが同様のパフォーマンスを取得する必要があり、可読性と保守性のある(議論の余地)の利点と:

CREATE FUNCTION GetAdjustedDate(@InputDate DATETIME) 
RETURNS TABLE AS RETURN 
SELECT DATEADD(hh,ISNULL((
    SELECT DateDateOffsetNumber 
    FROM DateOffset 
    WHERE @InputDate BETWEEN DateStartDate AND DateEndDate 
),0),@InputDate) AS AdjustedDate 

GO 
SELECT 
    ModifiedDate   = (SELECT AdjustedDate FROM dbo.GetAdjustedDate(T.ModifiedDate)) 
    ,CreatedDate   = (SELECT AdjustedDate FROM dbo.GetAdjustedDate(T.CreatedDate)) 
    ,ReceivedDateTime = (SELECT AdjustedDate FROM dbo.GetAdjustedDate(T.ReceivedDateTime)) 
    ,ResolvedDate  = (SELECT AdjustedDate FROM dbo.GetAdjustedDate(T.ResolvedDate)) 
    ,ReactivatedDateTime = (SELECT AdjustedDate FROM dbo.GetAdjustedDate(T.ReactivatedDateTime)) 
FROM TableA T 
関連する問題