2010-05-06 4 views
0

나는 2 개 테이블이 SQL 서버 2008SQL로 변환 NVARCHAR (255)

을 사용하고 있습니다 : 표 1 및 표 2

표 1이라고 한 열이 있습니다 OldDate은 nvarchar입니다 (255), 널
표 2라는 1 열 가지고

26/07/03 
NULL 
NULL 
23/07/2003 
7/26/2003 
NULL 
28/07/03 

표 1에

예 널 데이터 날짜 아니다 NewDate을 나는이 오류 (날짜로 OldDate) CAST

을 시도 :

Arithmetic overflow error converting expression to data type datetime.

내가 오류없이 NewDate에 OldDate를 삽입해야합니다. 일부 행을 건너 뛸 수 없습니다. http://www.sqlusa.com/bestpractices/datetimeconversion/

:

+0

예제 데이터에 대한

은 다음과 같아야합니다 26/07/03 NULL NULL 23/07/2003 7/26/2003 NULL 28/07/03 – steven

답변

3

CONVERT(datetime,OldDate ,103) 

가 "103"형식이 dd/mm/yyyy

여기에 편집

많은 예제와 같이 좋은입니다 변환기를 알려줍니다 사용해보십시오 당신은 m/d/y와 d/m/y 데이터를 가지고있는 것 같습니다. 이것은 당신이 할 수있는 최선의 방법입니다. :

DECLARE @Table1 table (PK int, OldDate nvarchar(255) null) 
DECLARE @Table2 table (PK int, NewDate datetime not null) 
INSERT @Table1 VALUES (1,'26/07/03') 
INSERT @Table1 VALUES (2,null) 
INSERT @Table1 VALUES (3,null) 
INSERT @Table1 VALUES (4,'23/07/2003') 
INSERT @Table1 VALUES (5,'7/26/2003') 
INSERT @Table1 VALUES (6,null) 
INSERT @Table1 VALUES (7,'28/07/03') 

SET DATEFORMAT dmy 

INSERT INTO @Table2 
     (PK, NewDate) 
    SELECT 
     PK, 
     CASE 
      WHEN ISDATE(OldDate)=1 THEN OldDate 
      ELSE '1/1/1900' 
     END 
     FROM @Table1 

SET DATEFORMAT mdy 

UPDATE t2 
    SET NewDate=OldDate 
    FROM @Table2   t2 
     INNER JOIN @Table1 t1 ON t2.PK=t1.PK 
    WHERE t2.NewDate='1/1/1900' AND ISDATE(OldDate)=1 

SELECT * FROM @Table2 

OUTPUT : 당신이 NOT NULL로 NewDate을 가지고 있기 때문에

PK   NewDate 
----------- ----------------------- 
1   2003-07-26 00:00:00.000 
2   1900-01-01 00:00:00.000 
3   1900-01-01 00:00:00.000 
4   2003-07-23 00:00:00.000 
5   2003-07-26 00:00:00.000 
6   1900-01-01 00:00:00.000 
7   2003-07-28 00:00:00.000 

(7 row(s) affected) 

나는 '1900'을 사용했다.

1

잘못된 데이터 (또는 오타)가있는 것 같습니다.

일부 날짜는 영국/프랑스어 표준 dd/mm/yyyy (코드 103 참조)이고 일부는 미국 표준 mm/dd/yyyy (코드 101)입니다. 당신이 CONVERT(datetime, [OldDate], 103)을 시도 할 수있는 최초의 사례를 들어

, 두 번째 CONVERT(datetime, [OldDate], 101)

+1

당신은 또한 2010 년 2 월 30 일 또는 ASAP와 같은 데이터도 유효 날짜가 아니며 정리가 필요합니다. isdate 함수를 사용하여 날짜로 변환 할 수없는 항목을 찾습니다. 또한 varchar 필드에 날짜를 다시 저장하지 마십시오! – HLGEM