2015-01-14 4 views
0

주말을 제외하고 경과 된 일 수를 결정하는 보고서에 대한 논리가 있습니다. 2 가지 가능한 시작 날짜가 있습니다 - 최초 영수증 날짜 또는 재 제출 날짜 (존재하는 경우). 내가 제대로 거기 [AnalysisDate][ResubmitReceivedDate] 앞에 올 때 어떤 경우가 있으며, 이러한 경우에, [OriginalReceivedDate] 여전히 [ResubmitReceivedDate]이있는 경우에도 사용되어야한다, 그러나 다음 CASECASE 조건부 날짜 조건부 논리

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) 
    ) 

를 사용하여이를 계산할 수 있어요.

이 논리를 위의 CASE 문에 어떻게 추가 할 수 있습니까?

+1

하지 대답, 그냥 몇 가지 코멘트를 만들 것입니다. (1) CASE는 문장이 아닌 표현식이며, 때로는 그 의미가 매우 중요 할 수 있습니다. (2) 제발,'dd'와'dw'와 같은 게으른 속기를 그만 사용하십시오 - [this post] (http://sqlblog.com/blogs/aaron_bertrand/archive/2011/09/20/bad-habits)를보십시오. 킥 - 사용 - 약식 - 날짜 - 시간 - operations.aspx). –

+0

@AaronBertrand 그에 따라 제목이 업데이트되었습니다. 귀하의 두 번째 요점에 관해서는 정식으로 언급되었습니다. 'DATEDIFF'에서 전체'datepart' 이름을 사용할 수 있는지 몰랐습니다. 약어가 필요하다고 생각했습니다! – Saggio

답변

1

가장 단순한 솔루션처럼 보일 것입니다. When 조건을 추가하는 것입니다. 이런 식으로 뭔가 :

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) 
    ) 

최종 경우

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 
+0

완벽한! 변경할 필요가있는 것은'DateDiff (일, [ResubmitReceivedDate], [AnalysisDate])> -1 THEN'이'... <-1'이되어야한다는 것입니다. – Saggio