2014-07-16 3 views
1

에 문자열에서 날짜 및/또는 시간을 변환 I가 내 테이블에 다음과 같은 열 :변환에 실패 할 때 SQL

year decimal(4,0) 
month decimal(2,0) 
day decimal(2,0) 

나는 다음과 같이 변환하려고 :

SELECT (CAST (CAST(year AS varchar(4)) 
      +CAST(month AS varchar(2)) 
      +CAST(day AS varchar(2) 
      ) AS date)) AS xDate 
FROM table 
ORDER BY xDate DESC 

그러나이 오류가 발생합니다 :

Conversion failed when converting date and/or time from character string.

+0

RT 시간에? –

+0

하드 코딩 된 숫자를 사용하여 빠른 테스트를 수행했으며 나에게 적합합니다. 따라서 "연도", "월"및 "날짜"는 숫자이며 허용되는 범위 내에 있습니까? – jimo3

+0

@Kris - 날짜로 변환하려고하지만 datetime으로 변환하기가 쉬운 경우에도 문제가 없지만 오류가 발생합니다. – Geeme

답변

0

이 문제는 테이블에 중복 데이터가 있기 때문에 발생합니다.). 테이블에서 다음을 확인하십시오.

1). 일 열의 값은 과 연결된 달의 최대 일 수 (예 : 2 달이 30 일 또는 31 일이 아니어야합니다.) 일 수 있습니다.

2). 월 열의 값은 또는 과 같아야합니다.

2

month 또는 day은 한자리 수 값일 수 있습니다. 이 같은 행이 있다면 :

year month day 
---- ----- --- 
2014 7  18 

당신의 방법은 2014718로 부품 문제의 오류가 발생할 것 date로 그것을 변환하는 후속 시도를 연결할 것입니다.

아마도 20140718과 같은 부분을 결합하여 문제없이 date으로 변환 할 수 있습니다. 나를 위해, 숫자 부분에서 그 형식으로 얻을 수있는 가장 쉬운 방법은 다음과 같이 이동하는 것입니다 :

  • 계산 year * 10000 + month * 100 + day;

  • 이전 결과를 char(8);

  • 문자열을 date으로 변환하십시오.

그래서, 거래-SQL에서이 같은 것 : 다른 주에

CAST(CAST(year * 10000 + month * 100 + day AS char(8)) AS date) 

, 나는 아마도 당신이 정말로 날짜는 물론, 그런 식으로 분할 저장해야하는지 여부를 알 수 없다, 하지만 그렇게하기를 원한다면 최소한 부품에 정수 유형을 사용하는 것을 고려하십시오. 나는 decimal(2,0)이 2 자리 넘게 월 또는 일 값을 가질 수 없도록하는 일종의 제약 조건으로 작용할 수 있지만, 유효하지 않은 달 또는 일을 갖는 것을 방지하지 못한다는 것을 알고 있습니다. 또 다른 주요 포인트는 decimal(2,0)int보다 더 많은 저장 공간이 필요합니다. smallint 또는 tinyint은 말할 것도 없습니다.

그래서,이 나에게 잘 보일 것입니다

year int, 
month int, 
day int 

하지만 당신은 가능한 한 많은 저장 공간을 절약에 있다면, 당신은 또한이 시도 할 수 :

year smallint, 
month tinyint, 
day tinyint 

을 마지막으로 만들기 위해 해당 열에서 유효하지 않은 값을 가질 수 없다면 아래처럼 체크 제약 조건을 추가하면됩니다.

ALTER TABLE tablename 
ADD CONSTRAINT CK_tablename_yearmonthday CHECK 
    ISDATE(CAST(year * 10000 + month * 100 + day AS char(8))) = 1 
;
관련 문제