检索给定日期的偏移值的有效方法

时间:2016-10-06 21:18:15

标签: sql-server tsql

我必须根据Region和Day灯节省计算偏移量,我必须为五个日期字段执行此操作,因此现在使用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

1 个答案:

答案 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