Saggio
Saggio

Reputation: 2274

CASE Expression with Dates conditional Logic

I have a logic in a query for a report that determines the number of days passed, excluding weekends. There are 2 possible start dates - the original receipt date or the date of a re-submit (if it exists). I am able to correctly calculate this using the following CASE statement

  CASE WHEN [ResubmitReceivedDate] IS NULL THEN
  (SELECT
        (DATEDIFF(dd, [OriginalReceivedDate] , [AnalysisDate]) + 1)
        -(DATEDIFF(wk,[OriginalReceivedDate] , [AnalysisDate]) * 2)
        -(CASE WHEN DATENAME(dw, [OriginalReceivedDate] ) = 'Sunday' THEN 1 ELSE 0 END)
        -(CASE WHEN DATENAME(dw, [AnalysisDate]) = 'Saturday' THEN 1 ELSE 0 END) 
    )
    ELSE
    (SELECT
        (DATEDIFF(dd, [ResubmitReceivedDate], [AnalysisDate]) + 1)
        -(DATEDIFF(wk, [ResubmitReceivedDate], [AnalysisDate]) * 2)
        -(CASE WHEN DATENAME(dw, [ResubmitReceivedDate]) = 'Sunday' THEN 1 ELSE 0 END)
        -(CASE WHEN DATENAME(dw, [AnalysisDate]) = 'Saturday' THEN 1 ELSE 0 END) 
    ) 

However, there are some instances when the [AnalysisDate] comes before the [ResubmitReceivedDate], and in these instances, the [OriginalReceivedDate] should still be used even though a [ResubmitReceivedDate] exists.

How can I add this logic to the above CASE statement?

Upvotes: 0

Views: 180

Answers (1)

KHeaney
KHeaney

Reputation: 785

Seems like the simplest solution would just be to add another When condition. Something like this:

WHEN DateDiff(day, [ResubmitReceivedDate], [AnalysisDate]) > -1 THEN
    (Select
        (DATEDIFF(day, [OriginalReceivedDate] , [AnalysisDate]) + 1)
        -(DATEDIFF(week,[OriginalReceivedDate] , [AnalysisDate]) * 2)
        -(CASE WHEN DATENAME(weekday, [OriginalReceivedDate] ) = 'Sunday' THEN 1 ELSE 0 END)
        -(CASE WHEN DATENAME(weekday, [AnalysisDate]) = 'Saturday' THEN 1 ELSE 0 END)
    )

Which would make your final case

Case
     WHEN [ResubmitReceivedDate] IS NULL THEN
        (Select
            (DATEDIFF(day, [OriginalReceivedDate] , [AnalysisDate]) + 1)
            -(DATEDIFF(week,[OriginalReceivedDate] , [AnalysisDate]) * 2)
            -(CASE WHEN DATENAME(weekday, [OriginalReceivedDate] ) = 'Sunday' THEN 1 ELSE 0 END)
            -(CASE WHEN DATENAME(weekday, [AnalysisDate]) = 'Saturday' THEN 1 ELSE 0 END)
        )
     WHEN DateDiff(day, [ResubmitReceivedDate], [AnalysisDate]) < -1 THEN
        (Select
            (DATEDIFF(day, [OriginalReceivedDate] , [AnalysisDate]) + 1)
            -(DATEDIFF(week,[OriginalReceivedDate] , [AnalysisDate]) * 2)
            -(CASE WHEN DATENAME(weekday, [OriginalReceivedDate] ) = 'Sunday' THEN 1 ELSE 0 END)
            -(CASE WHEN DATENAME(weekday, [AnalysisDate]) = 'Saturday' THEN 1 ELSE 0 END)
        )
    Else
        (SELECT
            (DATEDIFF(day, [ResubmitReceivedDate], [AnalysisDate]) + 1)
            -(DATEDIFF(week, [ResubmitReceivedDate], [AnalysisDate]) * 2)
            -(CASE WHEN DATENAME(weekday, [ResubmitReceivedDate]) = 'Sunday' THEN 1 ELSE 0 END)
            -(CASE WHEN DATENAME(weekday, [AnalysisDate]) = 'Saturday' THEN 1 ELSE 0 END) 
        )
End

Upvotes: 1

Related Questions