상세 컨텐츠

본문 제목

MSSQL DATATIME 형식 가지고 놀기

DataBase/MS-SQL

by xarfox 2009. 10. 12. 09:45

본문

일반적으로 datetime 형식은 `2004-01-01 23...` 형식으로 되어있으나, 실상은 내부적으로는 숫자형식의 날자값으로 존재한다.
이때문에 datetime 형식의 필드를 left, substring등의 함수를 거치면 원하는 문자열이 도출되지 않게 된다.

이를테면
  select contractdate from Table-Name 의 결과값은 `2004-01-01 23:12:32` 이다.

이를 `2004-01-01`값만을 취하려고 하여
  select left(contractdate,10) from Table-Name 으로 쿼리를 할경우엔 `01 01 2004`가 추출된다.

다시 Varchar형태로 형변환을 시키려고
  select cast(contractdate as varchar(20)) from Table-Name 으로 쿼리를 할경우엔 `01 01 2004 11:12PM` 의 값이 추출되는것을 볼수있다.

같은 의미로 convert를 이용하여
  select convert(varchar(20), contractdate) from Table-Name 으로 쿼리를 해도 cast와 같은 `01 01 2004 11:12PM` 의 값이 추출되는것을 볼수있다.


이와같은 문제를 해결하기 위해서 MS-SQL에선 convert() 함수중에 형식을 정의하고 있으니 다음과 같다.

세기 포함 안함 (yy) 세기 포함 (yyyy) 표준 입력/출력**
- 0 또는 100 (*) 기본값 mon dd yyyy hh:miAM(또는 PM)
1 101 USA mm/dd/yy
2 102 ANSI yy.mm.dd
3 103 영국/프랑스 dd/mm/yy
4 104 독일 dd.mm.yy
5 105 이탈리아 dd-mm-yy
6 106 - dd mon yy
7 107 - Mon dd, yy
8 108 - hh:mm:ss
- 9 또는 109 (*) 기본값 + 밀리초 mon dd yyyy hh:mi:ss:mmmAM(또는 PM)
10 110 USA mm-dd-yy
11 111 일본 yy/mm/dd
12 112 ISO yymmdd
- 13 또는 113 (*) 유럽 기본값 + 밀리초 dd mon yyyy hh:mm:ss:mmm(24h)
14 114 - hh:mi:ss:mmm(24h)
- 20 또는 120 (*) ODBC 표준 yyyy-mm-dd hh:mi:ss(24h)
- 21 또는 121 (*) ODBC 표준(밀리초) yyyy-mm-dd hh:mi:ss.mmm(24h)
- 126(***) ISO8601 yyyy-mm-dd Thh:mm:ss:mmm(공간 없음)
- 130* 쿠웨이트 dd mon yyyy hh:mi:ss:mmmAM
- 131* 쿠웨이트 dd/mm/yy hh:mi:ss:mmmAM



다음은 datetime 형식을 `2004-01-01`의 형식으로 뽑아내기 위한 쿼리를 보여주고있다.
  select convert(varchar(10), contractdate, 121), contractsdate from Table-Name

즉 convert함수를 통해서 121형식-yyyy-mm-dd hh:mi:ss.mmm(24h) 으로 변환된 값을 varchar(10)크기만 취하겠다는 의미이다.
이렇게되면 String `2004-01-01 23:12:32.000`의 값을 추출한뒤 left(10,String) 을 한것과 같은 효과를 보게된다.

관련글 더보기