2013-07-05 2 views
0

형식이 varchar (255) 인 tbl1에서 열을 읽고 datetime 형식으로 tbl2에로드하려고합니다. 아래 코드를 참조하십시오.SQL Server 2012 : datetime 결과에 범위를 벗어난 값 오류가 발생하면 varchar (255) 열을 캐스팅합니다.

SELECT CAST(LTRIM(RTRIM(NLCompany)) AS varchar(20)) AS SRC_NLCompany, 
CAST(LTRIM(RTRIM(AccountCode)) AS varchar(8)) AS SRC_AccountCode, 
CAST(LTRIM(RTRIM(DocumentNumber)) AS numeric(10, 0)) AS SRC_DocumentNumber, 
CAST(LTRIM(RTRIM(PaymentType)) AS varchar(1)) AS SRC_PaymentType, 
CAST(LTRIM(RTRIM(PostingDaybkDate)) AS datetime) AS SRC_PostingDaybkDate 
FROM TBL1 

오류 : varchar 데이터 형식을 datetime 데이터 형식으로 변환하면 범위를 벗어나는 값이 발생합니다.

답변

2

SQL Server에서 지원하는 많은 문자열 형식이 있습니다 (MSDN Books Online on CAST and CONVERT 참조). 대부분의 해당 형식은 이며 어떤 언어/날짜 형식 설정에 따라에 따라 달라 지므로 이러한 설정은 때때로 작동 할 수 있습니다.

이 문제를 해결하는 방법은 SQL Server가 지원됩니다 (약간 적응) ISO-8601 날짜 형식을 사용하는 것입니다 -이 형식은 항상작동 -에 관계없이 SQL 서버 언어와 DATEFORMAT 설정.

ISO-8601 format는 SQL 서버에서 지원하는 두 가지 맛으로 제공 :

  • YYYYMMDD 단지 날짜 (아무 시간 부분)에 대한; 여기에 참고하십시오 : 대시 없음!, 이것이 매우 중요합니다! YYYY-MM-DD이 아니며은 SQL Server의 dateformat 설정과 독립적이며 이 아닌 경우이 모든 상황에서 작동합니다!

나 : 날짜와 시간에 대한

  • YYYY-MM-DDTHH:MM:SS - 여기서주의 :이 형식 대시있다 (하지만이 생략 할 수 있습니다) 날짜와 시간 사이의 구분 기호로 고정 TDATETIME의 일부입니다.

이 내용은 SQL Server 2000 이상 버전에서 유효합니다. (!에만 DATE - 하지DATETIME)는 SQL Server 2008 또는 최신와 DATE 데이터 유형을 사용하는 경우

, 다음 SQL 서버의 모든 설정을, 너무, 당신은 참으로 또한 YYYY-MM-DD 형식을 사용할 수 있습니다 그것은 작동합니다 .

왜이 전체 주제가 너무 까다 롭고 다소 혼란 스러울 지 물어 보지 마십시오. 그것이 바로 그런 방식입니다. 그러나 YYYYMMDD 형식을 사용하면 SQL Server의 모든 버전과 SQL Server의 언어 및 날짜 형식 설정에 문제가 없어야합니다. 당신은 날짜와 시간을 필요로 할 때

SQL 서버 2008 및 최신의 추천은 날짜 부분 만 필요한 경우 DATE를 사용하는 것입니다, 그리고 DATETIME2(n). 가능한 경우 DATETIME 데이터 유형의 단계적 시작을 시도해야합니다.

관련 문제