2014-09-26 3 views
2

I 2008 SQL 서버에서 CASE 문으로 다시 쓰기이 Microsoft Access에서 IF 문에 시도 : 나는 여러 가지 방법을 시도했습니다케이스 문 SQL

Status: IIf(
      IIf(B.[Online Class Completion Date] Is Null, 
      Null, 
      DateDiff("w",A.[Trust Start Date],B.[Online Class Completion Date]) 
      ) <=6, 
     "Pass", 
     IIf(
      IIf(B.[Online Class Completion Date] Is Null, 
      Null, 
      DateDiff("w",A.[Trust Start Date],B.[Online Class Completion Date]) 
      ) >6, 
      "Fail", 
     IIf(DateDiff("w",A.[Trust Start Date],MAX(B.[Month])) <=6, 
     "NotApp", 
     "Never" 
     ) 
     ) 
     ) 

하지만 난 그냥 캔트 중첩 권리를 얻을 것 . 내가 쓰기 시작하는 패스를 얻고 실패하지만 NotApps 또는 느 베르

이는 없습니다 :

CASE WHEN 
    (CASE WHEN CONVERT(DATETIME,LEFT(B.[Online Class Completion Date],2)+'/'+SUBSTRING(B.[Online Class Completion Date],4,2)+'/'+RIGHT(B.[Online Class Completion Date],4),103) IS NULL 
    THEN NULL 
    ELSE DATEDIFF(ww,A.[Trust Start Date],CONVERT(DATETIME,LEFT(B.[Online Class Completion Date],2)+'/'+SUBSTRING(B.[Online Class Completion Date],4,2)+'/'+RIGHT(B.[Online Class Completion Date],4),103)) 
    END) 
<=6 
THEN 'Pass' 
WHEN 
    (CASE WHEN CONVERT(DATETIME,LEFT(B.[Online Class Completion Date],2)+'/'+SUBSTRING(B.[Online Class Completion Date],4,2)+'/'+RIGHT(B.[Online Class Completion Date],4),103) IS NULL 
    THEN NULL 
    ELSE DATEDIFF(ww,A.[Trust Start Date],CONVERT(DATETIME,LEFT(B.[Online Class Completion Date],2)+'/'+SUBSTRING(B.[Online Class Completion Date],4,2)+'/'+RIGHT(B.[Online Class Completion Date],4),103)) 
    END) 
>6 
THEN 'Fail' 
WHEN DATEDIFF(WEEK,A.[Trust Start Date],MAX(B.[Month])) <=6 
THEN 'NotApp' 
ELSE 'Never' 
END AS [Status] 

어떤 도움이 크게 감사합니다!

+1

왜 이러한 모든 CONVERT가 날짜 값을 처리합니까? 적절한 데이터 유형을 사용하여 날짜 값을 저장하고 있습니까? – Paolo

+0

데이터를 피더 시트에서 가져옵니다. 실제 날짜 값으로 날짜를 입력하는 다른 직원에게 의존 할 수 없습니다. 꽤 자주 텍스트로 입력되므로 변환됩니다. 모든 날짜가 실제로 날짜 값이되도록 보장하는 것은 아주 큰 작업입니다. –

+0

큰 작업을 지연시키는 것만 유의하십시오. 가져 오기에서 데이터 정리 및 유효성 검사를 수행하지 않으면 ** 물릴 것입니다 * * 미래에 압력을 받고 바로 그 같은 작업을 완료해야합니다 (머피를 아십니까? 그는 데이터 가져 오기 작업을 좋아합니다! ^^). 그것이 한 번 수입이라면 시간을 들여 모든 필요한 수표를 수행하십시오. 예약 된/매일/어떤 수입이라면 나쁜 데이터를 거부하십시오. – Paolo

답변

1

우선 끄기 : CONVERT(DATETIME,LEFT(B.[Online Class Completion Date],2)+'/'+SUBSTRING(B.[Online Class Completion Date],4,2)+'/'+RIGHT(B.[Online Class Completion Date],4),103) IS NULL '//'이 최소한으로 포함되므로 TRUE가되지 않습니다. 해당 필드가 NULL인지, 변환 할 이유가 없는지 테스트하십시오.

또한 CASE 문은 TRUE 조건을 찾은 후에 종료되므로 IIF()와 마찬가지로 중첩 할 필요가 없습니다. 어느 쪽이 당신이 향하고 있는지 정확히 알기 때문에 좋습니다. 여기

기존의 시도에 약간의 변화를, 그것에 찔린입니다 :

CASE 
    WHEN 
     CASE 
      WHEN B.[Online Class Completion Date] THEN NULL 
      ELSE datediff(ww,A.[Trust Start Date],CONVERT(DATETIME,LEFT(B.[Online Class Completion Date],2)+'/'+SUBSTRING(B.[Online Class Completion Date],4,2)+'/'+RIGHT(B.[Online Class Completion Date],4),103)) 
      END <= 6 THEN 'Pass' 
    WHEN 
     CASE 
      WHEN B.[Online Class Completion Date] THEN NULL 
      ELSE datediff(ww,A.[Trust Start Date],CONVERT(DATETIME,LEFT(B.[Online Class Completion Date],2)+'/'+SUBSTRING(B.[Online Class Completion Date],4,2)+'/'+RIGHT(B.[Online Class Completion Date],4),103)) 
      END > 6 THEN 'Fail' 
    WHEN 
     DateDiff(ww,A.[Trust Start Date],MAX(B.[Month])) <= 6 THEN "NotApp" 
    ELSE 
     'Never' 
    END as 'Status' 
+0

나는 /를 생각조차하지 못했습니다. 필드가 null 인 경우에도 어쨌든 변환 할 수 없습니까? 그럼 여전히 null이 될까요? –

+0

그래 .. 만약 당신이 '//'를 DateTime으로 변환하려고한다면 무슨 일이 일어날 지 모르겠다. 나는 단지 오류 일 것이라고 추측한다. 이것이 지금 쓰여지는 방식은 먼저 NULL을 확인한 다음 변환을 시도하는 것입니다. 수년간의 경험을 통해 사용자가 체크되지 않은 날짜 문자열을 CHAR 필드로 허용하는 경우 CONVERT (DATETIME, ) 수식이 슬픔을 일으킬 것이라고 생각했습니다.어쩌면 나보다 나은 사용자 일 수도 있습니다. – JNevill

0

이것은 적절한 중첩 케이스 구조이지만 SQL-Server에서 dateDiff 기능을 정리해야합니다.

CASE WHEN B.[Online Class Completion Date] IS NULL 
    THEN NULL 
    ELSE CASE WHEN DateDiff('w', A.[Trust Start Date], B.[Online Class Completion Date]) <= 6 
       THEN 'Pass' 
       ELSE CASE WHEN DateDiff('w', A.[Trust Start Date], B.[Online Class Completion Date]) > 6 
         THEN 'Fail' 
         ELSE CASE WHEN DateDiff('w', A.[Trust Start Date], MAX(B.[Month])) <= 6 
            THEN 'NotApp' 
            ELSE 'Never' 
            END 
         END 

       END 
    END as Status 

지금, 그보다 완전한 쿼리를보고, 어쩌면 더이 경우 구조를 단순화 할 날짜에 수행 일부 원료 작업을 가진 폐기물 시간 다시 대 전체 QRY의 검토 후 그 일을 선호했다 문제의 모든 날짜를 변환 ...하지만 잘하면 귀하의 전환을 다르게 완료하는 좋은 점프.

0

확인을 (그 끔찍한 문자열 날짜 필드에 숯불에서 날짜에 사건을 추가하는 업데이트), 나는 모든 통해 갔다 피더 시트를 작성하고 코드를 정리할 적절한 날짜/시간 필드로 변경했습니다.

그래서이 이제 작동 : 내가 실수로 부분적으로 목적에 부분적으로 어떤 사람들을 제외하고

CASE 
WHEN 
    CASE 
     WHEN B.[Online Class Completion Date] IS NULL THEN NULL 
     ELSE datediff(ww,A.[Trust Start Date],B.[Online Class Completion Date]) 
     END <= 6 THEN 'Pass' 
WHEN 
    CASE 
     WHEN B.[Online Class Completion Date] IS NULL THEN NULL 
     ELSE datediff(ww,A.[Trust Start Date],B.[Online Class Completion Date]) 
     END > 6 THEN 'Fail' 
WHEN 
    DateDiff(ww,A.[Trust Start Date],MAX(B.[Month])) <= 6 THEN 'NotApp' 
ELSE 
    'Never' 
END as [Status] 

. 나는 여전히 적절한 SQL에 익숙하지 않다. 당신이 Access에서와 같이 쿼리를 어떻게 쿼리 하는가?