2017-10-14 8 views
0

날짜를 포함하지 않아야하는 날짜가 데이터베이스에 포함되어 있으므로 날짜를 확인하여 올바른 날짜를 구성해야합니다. 일부,데이터 형식 날짜를 구성 할 수 없습니다. 일부 인수의 값이 올바르지 않습니다.

SELECT 
    NewDate = CASE 
       WHEN DATEPART(dayofyear, GETDATE()) < DATEPART(dayofyear, t.myDate) 
        THEN DATEFROMPARTS('2017', DATEPART(MONTH,t.myDate), DATEPART(DAY, t.myDate)) 
        ELSE DATEFROMPARTS('2018', DATEPART(MONTH,t.myDate), DATEPART(DAY,t.myDate)) 
       END 
FROM 
    MyTable t 

그러나 이 (t.myDate이 널 (NULL) 날짜입니다) (날짜가 올해는 아직 오지 않으면, 나는 날짜가 지난 경우, 나는 2018을 설정하려면, 2017을 설정할) 경우 다음과 같은 오류 메시지가 나타납니다.

일부 인수에는 유효하지 않은 값이 있습니다.

문제가 무엇인지 확실하지 않지만 일부 행이 NULL임을 알고 있습니다. 그래서 간단하게 문제가있는 경우에 오늘 날짜를 사용하는 CASE 표현식을 사용하여 문제를 해결하기 위해 노력했다 :

SELECT 
    NewDate = CASE 
       WHEN t.myDate is null 
        THEN GETDATE() 
       WHEN DATEPART(MONTH,t.myDate) < 1 
        THEN GETDATE() 
       WHEN DATEPART(MONTH,t.myDate) > 12 
        THEN GETDATE() 
       WHEN DATEPART(DAY,t.myDate) < 1 
        THEN GETDATE() 
       WHEN DATEPART(DAY,t.myDate) > 31 
        THEN GETDATE() 
       WHEN ISDATE(t.myDate) = 0 
        THEN GETDATE() 
       WHEN DATEPART(dayofyear, GETDATE()) < DATEPART(dayofyear, t.myDate) 
        THEN DATEFROMPARTS('2017', DATEPART(MONTH,t.myDate), DATEPART(DAY, t.myDate)) 
       ELSE DATEFROMPARTS('2018', DATEPART(MONTH,t.myDate), DATEPART(DAY,t.myDate)) 
      END 
FROM 
    MyTable t 

하지만 난 여전히 같은 오류가 발생합니다. 잘못된 데이터 품질 문제를 테스트 중이거나 CASE식이 예상대로 작동하지 않습니다.

또한 : 그것은 NULL 행에 대한 where 절을 사용하는 데 도움이되지 않습니다

WHERE t.myDate IS NOT NULL 

가 어떻게 데이터 품질 문제를 찾을 수 있습니다, 나는 주위 어떻게받을 수 있나요?

외에 당신은 또한 월 29 일에 문제가있을 수 있습니다 NULL 검사에서

답변

1

(I는 SQL 서버 2012을 사용하고 있습니다). 예를 들어, 날짜가 2016-02-29이고 날짜가 2017-02-29 인 경우이 날짜가 유효하지 않으므로 위 오류가 발생합니다.

일반적으로 커서를 사용하여 레코드를 반복하고 TRY/CATCH 내부에서 논리를 실행할 수 있습니다. 예외적으로 불쾌한 데이터를 인쇄하고 문제가 무엇인지 확인할 수 있습니다.

+0

감사합니다. 그 것을 확인하려고합니다. – Skywise

+0

예, 효과가있었습니다. DATEPART (MONTH, t.myDate) = 2 및 DATEPART (DAY, t.myDate) = 29) \t \t 다음 DATEPROMPARTS ('2018 ', DATEPART (MONTH, t.myDate), DATEPART (DAY, DATEADD (DAY, -1, t.myDate))) – Skywise