* 중요한 점 : 변환하려는 모든 문자형 데이터의 형식이 같아야한다.
가끔은 문자열로 된 날짜 데이터를 날짜형 데이터로 바꾸고자 하는 경우가 있습니다. 날짜형 데이터라고 한다면 datetime 형과 smalldatetime 형을 이야기 합니다. 날짜형 데이터인 경우는 다양한 날짜관련 함수를 이용한 응용이 가능하기 때문입니다. 하지만 그렇지 않은 경우, 즉 문자형으로 되어 있는 경우 날짜 함수를 이용하기 위해서는 문자열을 날짜형으로 바꾸어주는 과정이 추가로 필요하게 됩니다.
특히 웹을 통해 입력된 날짜를 테이블에 기록하게 되는 경우 다음과 같은 형태로 날짜가 테이블에 기록이 되는 경우가 많습니다.
2003-12-01 오전 10:30:21
2003-12-02 오후 05:12:25
위와 같이 기록이 될 경우 MS SQL 서버는 데이터 중간의 '오전' 또는 '오후'를 인식히자 못하기 때문에 위 문자열을 날짜형 데이터로 변환하기가 쉽지 않습니다. 이러한 문제로 위와 같은 데이터를 정확한 날짜형 데이터로 변환하고자 하는 경우가 많이 있습니다. 이를 위한 방법을 제시하고자 합니다.
1. 에러 확인
위에서 예시한 형태의 데이터가 테이블에 기록이 된 경우 발생하는 문제를 살펴보도록 하겠습니다. 다음과 같이 만들어진 테이블이 있다고 가정을 하겠습니다.
CREATE TABLE Test ( col1 int, col2 varchar(25) ) GO |
INSERT INTO Test VALUES(1, '2003-10-01 오후 09:10:20') INSERT INTO Test VALUES(2, '2003-10-10 오전 10:30:20') GO |
SELECT DateAdd(mm, 1, col2) AS col3 FROM Test |
서버: 메시지 241, 수준 16, 상태 1, 줄 1 문자열을 datetime으로 변환하는 중 구문 오류가 발생했습니다. |
2. 정상적인 날짜형 데이터로 변환
이제 위에서 문제가 되고 있는 col2 컬럼의 값을 MS SQL 서버가 인식하는 날짜형 데이터로 바꾸는 방법을 살펴보도록 하겠습니다.
'2003-10-01 오후 09:10:20'
'2003-10-10 오전 10:30:20'
와 같은 데이터를
'2003-10-01 09:10:20 PM'
'2003-10-10 10:30:20 AM'
로 바꾸는 방법을 다음과 같이 생각할 수 있습니다.
"문자열 중간에 '오전'이 포함되어 있으면 뒷 부분에 'AM'을 붙여주고, 그렇지 않으면 뒷 부분에 'PM'을 붙여주고 중간의 '오전','오후'는 없애면 되겠네...그리고 위치를 보니 문자열 12번째 자리에서 두 글자가 '오전','오후' 값이네..."
위 방법을 그대로 SQL문으로 구현한다면 다음과 같습니다.
SELECT Substring(col2, 1, 10) + Substring(col2, 14, 9) + ' ' + CASE Substring(col2, 12, 2) WHEN '오전' THEN 'AM' ELSE 'PM' END AS col2 FROM Test |
col2 ----------------------------------------- 2003-10-01 09:10:20 PM 2003-10-10 10:30:20 AM (2개 행 적용됨) |
UPDATE Test SET col2 = Substring(col2, 1, 10) + Substring(col2, 14, 9) + ' ' + CASE Substring(col2, 12, 2) WHEN '오전' THEN 'AM' ELSE 'PM' END |
SELECT DateAdd(mm, 1, col2) AS col3 FROM Test |
col3 ------------------------------------------------------ 2003-11-01 21:10:20.000 2003-11-10 10:30:20.000 (2개 행 적용됨) |
만일 col2 컬럼의 데이터형을 varchar(25) 가 아닌 datetime으로 바꾸고자 한다면 어떻게 하면 될까요?
다음과 같이 ALTER TABLE 문을 이용하면 됩니다.
ALTER TABLE Test ALTER COLUMN col2 datetime |
4. 정리
특별한 경우가 아니면 날짜 데이터는 datetime 또는 smalldatetime 형 컬럼에 기록을 하는게 좋습니다. 그렇지 않으면 날짜 연산을 사용하지 못하게 되거나, 잘못된 날짜 데이터가 기록이 될 염려가 있기 때문입니다. 특별한 경우라 함은 년별 또는 월별, 일별 검색을 위해 날짜를 분리해야 한다거나 하는 경우입니다.
데이터베이스의 무결성은 무결성을 유지하도록 제대로 설정하는것으로부터 시작됩니다
댓글 없음:
댓글 쓰기