문자열을 날짜/시간 타입으로 변환
날짜/시간 타입 문자열 권장 형식
문자열을 날짜/시간 타입으로 변환할 때에는 문자열을 다음과 같은 형식으로 작성하는 것을 권장한다.
- DATE 타입
- [[[[Y]Y]YY]M]MDD
- [[[[Y]Y]YY]-M]M-DD
- MM/DD/YYYY
- TIME 타입
- HH[:MM[:SS]] ["am"|"pm"]
- DATETIME 타입
- YYYY-MM-DD HH:MM:SS[.msec] YY-MM-DD HH:MM:[SS[.msec]]
- YY-MM-DD H
- TIMESTAMP 타입
- YYYY-MM-DD HH:MM:SS
- YY-MM-DD HH:MM:[SS]
- YY-MM-DD H
DATE 문자열 허용 형식
[year sep] month sep day
구분자(sep)가 빗금(/)일 때에는 다음과 같은 순서로 인식한다.
month/day[/year]
구분자(sep)를 사용하지 않을 때에는 다음과 같은 형식으로 인식한다. 연도는 4자리까지 허용하고, 월은 2자리까지 허용한다. 일은 항상 2자리를 입력해야 한다.
[[[[Y]Y]YY]M]MDD
TIME 문자열 허용 형식
[hour]:min[:[sec]] [.[msec]] [am|pm]
- 09:10:15.359 am
- 09:10:15
- 09:10
- :10
[[[[[[Y]Y]Y]Y]M]MDD]HHMMSS[.[msec]] [am|pm]
- 20110420091015.359 am
- 0420091015
[H]HMMSS[.[msec]] [am|pm]
[M]MSS[.[msec]] [am|pm]
[S]S[.[msec]] [am|pm]
참고 CUBRID 2008 R3.1 이하 버전에서는 [H]H 형식을 허용했다. 즉 R3.1 이하 버전에서 문자열 '10'은 TIME '10:00:00'으로 변환되었으나, R4.0부터는 TIME '00:00:10' 으로 변환된다.
시간-날짜 순서의 문자열 허용 형식
[hour]:min[:sec[.msec]] [am|pm] sep [year-]month-day
- 09:10:15.359 am 2011-04-20
- :10 04-20
[hour]:min[:sec[.msec]] [am|pm] sep month/day[/[year]]
- 09:10:15.359 am 04/20/2011
- :10 04/20
hour[:min[:sec[.[msec]]]] [am|pm] sep [year-]month-day
- 09:10:15.359 am 04-20
- 09 04-20
hour[:min[:sec[.[msec]]]] [am|pm] sep month/day[/[year]]
- 09:10:15.359 am 04/20
- 09 04/20
DATETIME 문자열 허용 형식
[year sep] month sep day [sep] [sep] hour [sep min[sep sec[.[msec]]]]
month/day[/year] [sep] hour [sep min [sep sec[.[msec]]]]
year sep month sep day sep hour [sep min[sep sec[.[msec]]]]
month/day/year sep hour [sep min[sep sec [.[msec]]]]
YYMMDDH (시간이 한 자리 수일 때에만 허용)
YYMMDDHHMM[SS[.msec]]
YYYYMMDDHHMMSS[.msec]
규칙
msec은 밀리초를 나타내는 일련의 숫자이다. 앞에서 네 번째 자리부터 이후의 숫자는 무시된다.
sep은 허용되는 구분자 문자열을 나타낸다. 구분자 문자열의 규칙은 다음과 같다.
- TIME 문자열은 시간 구분자로 항상 하나의 콜론(:)을 사용해야 한다.
- DATE와 DATETIME 문자열은 구분자(sep) 없이 연속된 숫자로 나타낼 수 있고, 영숫자가 아닌 문자(non-alphanumeric) 여러 개를 구분자로 사용할 수 있다. DATETIME 문자열은 시간과 날짜를 공백으로 구분할 수 있다.
- 입력 문자열 안에서 구분자들은 동일하지 않아도 된다.
- 시간-날짜 순서의 문자열은 시간 구분자로 콜론(:)만 사용할 수 있으며, 날짜 구분자로는 하이픈(-)이나 빗금(/)만 사용할 수 있다.
- DATE 문자열은 콜론(:)이나 다른 모든 구분자를 사용할 수 있다.
날짜 부분의 문자열에는 다음 규칙이 적용된다.
- 연도는 구문이 허용하는 한 생략할 수 있다.
- 연도를 두 자리로 입력하면 1970년~2069년 범위의 연도를 나타낸다. 즉, YY<70 이면 2000+YY으로 처리하고, YY>=70이면 1900+YY으로 처리한다. 한 자리나 세 자리, 네 자리 숫자로 연도를 입력하면 해당 숫자 그대로를 나타낸다.
- 문자열 앞뒤의 공백과 뒤의 문자열은 무시된다. DATETIME, TIME 문자열을 위한 am/pm 지정자는 시간 값의 일부로 인식하지만, 공백이 아닌 문자가 뒤에 붙으면 am/pm 지정자로 인식되지 않는다.
CUBRID의 TIMESTAMP 타입은 DATE타입과 TIME 타입으로 구성되고, DATETIME 타입은 DATE 타입과 TIME 타입에 밀리초(milliseconds)가 더해져서 구성된다. 입력 문자열은 날짜(DATE 문자열), 시간(TIME 문자열), 혹은 둘 다(DATETIME 문자열) 포함할 수 있다. 특정 타입의 데이터를 보유한 문자열은 다른 타입으로도 변환될 수 있으며 다음과 같은 규칙이 적용된다.
- DATE 문자열을 DATETIME 타입으로 변환하면 시간 값은 '00:00:00'이 된다.
- TIME 문자열을 DATETIME 타입으로 변환하면 콜론(:)이 날짜 구분자로 인식되어 TIME 문자열이 날짜를 나타내는 문자열로 인식되고, 시간 값은 '00:00:00'이 된다.
- DATETIME 문자열을 DATE 타입으로 변환하면 결과값에서 시간 부분은 무시되지만, 시간 입력값의 포맷은 유효해야 한다.
- DATETIME 문자열을 TIME 타입으로 변환할 수 있지만, 다음과 같은 규칙이 적용된다.
-
- 문자열에 있는 날짜와 시간은 최소한 하나의 빈 칸에 의해 구분되어야 한다.
- 결과값에서 날짜 부분은 무시되지만, 날짜 입력값의 포맷이 유효해야 한다.
- 날짜 부분의 연도가 4자리 이상이거나(0으로 시작할 수 있음), 시간 부분이 최소한 시와 분([H]H:[M]M)을 포함해야 한다. 그렇지 않으면 날짜 부분이 [MM]SS 포맷의 TIME 타입으로 인식되고, 뒤이어 나오는 문자열은 무시된다.
- DATETIME 문자열의 각 단위(년, 월, 일, 시, 분, 초) 중 하나가 999999보다 크면, 숫자가 아닌 것으로 인식하여 해당 단위가 포함된 문자열이 무시된다. 예를 들어 '2009-10-21 20:9943:10' 은 분 단위의 값이 범위를 벗어나므로 에러가 발생한다. 그러나 '2009-10-21 20:1000123:10'이 입력되면 '2009'를 MMSS 포맷의 TIME 타입으로 인식하여 TIME '00:20:09'를 반환한다.
- 시간-날짜 순서의 문자열을 TIME 타입으로 변환하면 문자열의 날짜 부분은 무시되지만, 날짜 부분의 포맷은 유효해야 한다.
- 시간 부분이 있는 모든 입력 문자열은 변환 시 [.msec] 을 허용하지만, DATETIME 타입만 그 값을 유지한다. DATE, TIMESTAMP, TIME와 같은 타입으로 변환하면 msec 값을 버린다.
- DATETIME, TIME 문자열에서의 모든 변환은 시간 값 뒤에 나오는 영문 로캘(locale) 또는 서버의 현재 로캘로 쓰여진 am/pm 지정자를 허용한다.
예제
SELECT CAST('420' AS DATE);
cast('420' as date)
======================
04/20/2011
SELECT CAST('91015' AS TIME);
cast('91015' as time)
========================
09:10:15 AM
SELECT CAST('110420091035.359' AS DATETIME);
cast('110420091035.359' as datetime)
=======================================
09:10:35.359 AM 04/20/2011
SELECT CAST('110420091035.359' AS TIMESTAMP);
cast('110420091035.359' as timestamp)
========================================
09:10:35 AM 04/20/2011