2009-06-09 7 views
2

나는 char (8) 또는 20090609로 정의 된 날짜 필드와 char (4) 또는 1230으로 정의 된 시간 필드가있는 SQL 테이블을 가지고있다. 나는이 데이터를 다른 테이블로 옮기고있다. 필드를 만들고 새 테이블의 smalldatetime 필드에 넣습니다.전송하지 않을 데이터를 어떻게 확인할 수 있습니까?

INSERT NewTable(eventdate) 
SELECT 
    CAST((datecol + ' ' + substring(timecol, 1, 2) + ':' + substring(timecol, 3, 2)) as smalldatetime) 
FROM OldTable 

내가 이것을 실행하면, 나는 오류 얻을 : 내 쿼리는 다음과 같다

The conversion of char data type to smalldatetime data type resulted in an out-of-range smalldatetime value.

를 I했습니다 확인 렌 (datecol) 시도 렌 (timecol)는 그들이 있는지 확인 적어도 정확한 숫자. 문제가되는 데이터, 제안 사항을 어떻게 찾을 수 있는지 잘 모르겠습니다. 데이터베이스가 SQL2000이고 SMO 2008을 사용하고 있습니다.

답변

0

1 월 1 일, 1900, 가까이 검사에서 EDIT

6 월 6, 2079 I는 시간의 제 2 부분에 대한 문자열 파라미터 일 수있다 생각 값들 잘못된 (전체 문제가 될 수있는) 문자열 반영하기 위해 아래 업데이트 (timecol, 3, 2)

이 SQL 모든 날짜의 길이가 8 자이고, 모든 시간은 4

를 있다고 가정 않는 새로운 접근
Select SubString(DateCol, 1, 4) as tehYear, 
Substring(DateCol, 5,2) as tehMonth, 
SubString(DateCol, 7,2) as tehDay, 
SubString(TimeCol, 1,2) as tehHour, 
Substring(TimeCOl, 3,4) as tehMinute, 
* 
from OldTable 
where 
(SubString(DateCol, 1,4) > 9999 or SubString(DateCol, 1,4) < 1753) 
OR (Substring(DateCol, 5,2) > 12 or Substring(DateCol, 5,2) < 1) 
OR (SubString(DateCol, 7,2) > 31 or SubString(DateCol, 7,2) < 1) 
OR (SubString(TimeCol, 1,2) > 23 or(SubString(TimeCol, 1,2) < 0) 
OR (Substring(TimeCOl, 3,4) > 59 or Substring(TimeCOl, 3,4) <0) 

datetime으로 캐스팅하고 문제 데이터를 식별하기 위해 해당 범위를 벗어난 날짜가 있는지 확인하십시오.

SELECT 
    CAST((datecol + ' ' + substring(timecol, 1, 2) + ':' + substring(timecol, 3, 2)) 
    as datetime) 
    FROM OldTable 
    Where CAST((datecol + ' ' + substring(timecol, 1, 2) 
    + ':' + substring(timecol, 3, 2)) as datetime) 
    > Cast('06/06/2079' as datetime) or CAST((datecol + ' ' 
    + substring(timecol, 1, 2) + ':' + substring(timecol, 3, 2)) as datetime) 
    < Cast('01/01/1900' as datetime) 
+0

좋은 접근 방식,이 + 1과 12 사이의 1 월과 28 사이의 하루를 확인하고 많은 오류를 필터링해야합니다. – tekBlues

+0

나는 또한 접근 방식을 좋아하지만, 그것으로 "char 데이터 유형을 datetime 데이터 형식이 범위를 벗어난 datetime 값을 가져 왔습니다. " – scottm

+0

당신은 무엇을, 당신의 하위 문자열이 당신의 timecol의 두 번째 부분에 대해 꺼져 있다고 생각합니다. substring (timecol, 3, 2)이어야합니다. – cmsjr

-1

쿼리 분석기에서 쿼리를 실행하면 오류가 발생한 행을 알려야합니다! 이것은 허용 smalldatetime으로 범위 밖으로 아마

+0

아니요, 난 단지 0 행에 영향을받습니다. – scottm

6

이 시도 :

SELECT datecol, timecol 
FROM OldTable 
WHERE ISDATE(datecol + ' ' + substring(timecol, 1, 2) + ':' + substring(timecol, 2, 2)) = 0 

행을 성공적으로 변환 할 수 없습니다 보여줄 것이다.

+0

해당 쿼리는 date : 20081024 및 time : 1657과 같은 데이터가있는 행을 반환합니다. 데이터 자체를 캐스팅하려고하면 잘 처리됩니다. – scottm

+0

@OrbMan, timecol의 두 번째 부분을 가져 오는 부분 문자열이 내 예 (및 네)에서 잘못되었습니다. substring (timecol, 3, 2)으로 변경하고 예제를 사용했지만 동일한 오류가 발생합니다. – scottm

+0

@ scotty2012, 그의 예를 올바르게 읽으십니까? 그의 질문은 당신에게 일하지 않을 것들을 보여줄 것입니다. 따라서보고없이 한 번에이 작업을 수행하려면 ISDATE = 1 인 항목을 찾으십시오. –

관련 문제