DATETIME 타입으로 변환
DATETIME 타입의 유효 범위:
[0000-01-01 00:00:00.000000, 9999-12-31 23:59:59.999999]
DATETIME 타입에는 소수 자릿수를 나타내는 타입 매개변수 p가 포함됩니다. 전체 표기는 DATETIME(p) 타입입니다. 예를 들어 DATETIME(6)은 마이크로초 정밀도를 지원하는 DATETIME 타입을 나타냅니다.
String에서 변환
엄격 모드
BNF 정의
<datetime> ::= <date> (("T" | " ") <time> <whitespace>* <offset>?)?
| <digit>{14} <fraction>? <whitespace>* <offset>?
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
<date> ::= <year> ("-" | "/") <month1> ("-" | "/") <day1>
| <year> <month2> <day2>
<year> ::= <digit>{2} | <digit>{4} ; 1970 as the boundary
<month1> ::= <digit>{1,2} ; 01–12
<day1> ::= <digit>{1,2} ; 01–28/29/30/31 depending on the month
<month2> ::= <digit>{2} ; 01–12
<day2> ::= <digit>{2} ; 01–28/29/30/31 depending on the month
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
<time> ::= <hour1> (":" <minute1> (":" <second1> <fraction>?)?)?
| <hour2> (<minute2> (<second2> <fraction>?)?)?
<hour1> ::= <digit>{1,2} ; 00–23
<minute1> ::= <digit>{1,2} ; 00–59
<second1> ::= <digit>{1,2} ; 00–59
<hour2> ::= <digit>{2} ; 00–23
<minute2> ::= <digit>{2} ; 00–59
<second2> ::= <digit>{2} ; 00–59
<fraction> ::= "." <digit>*
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
<offset> ::= ( "+" | "-" ) <hour-offset> [ ":"? <minute-offset> ]
| <special-tz>
| <long-tz>
<hour-offset> ::= <digit>{1,2} ; 0–14
<minute-offset> ::= <digit>{2} ; 00/30/45
<special-tz> ::= "CST" | "UTC" | "GMT" | "ZULU" | "Z" ; case-insensitive
<long-tz> ::= ( ^<whitespace> )+ ; e.g. America/New_York
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
<digit> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
<area> ::= <alpha>+
<location> ::= (<alpha> | "_")+
<alpha> ::= "A" | … | "Z" | "a" | … | "z"
<whitespace> ::= " " | "\t" | "\n" | "\r" | "\v" | "\f"
규칙 설명
변환 대상 타입을 DATETIME(<scale>)이라고 가정하며, <scale>의 범위는 [0, 6]입니다.
전체 구조
-
날짜 부분은 필수이며, 시간 부분과 시간대 부분은 선택 사항입니다.
-
시간이 있으면 날짜와 시간 사이를 대문자 "T" 또는 공백으로 구분할 수 있습니다.
-
시간대가 있으면 시간과 시간대 사이에 ASCII 공백 문자를 개수 제한 없이 넣을 수 있습니다.
-
ASCII 문자만 허용됩니다. 입력 문자열에 ASCII가 아닌 문자가 있으면 위의 BNF 정의를 충족하지 않으므로 형식 오류로 처리됩니다.
날짜 부분 <date>
-
다음 두 가지 형식이 허용됩니다.
-
구분자가 있는 형식:
YYYY-MM-DD등. -
이어 붙인 형식:
YYYYMMDD등.
-
-
<year>: 두 자리 또는 네 자리 숫자-
두 자리 연도(00-99): < 70이면 2000+두 자리 값, ≥ 70이면 1900+두 자리 값으로 해석합니다.
-
네 자리 연도는 그대로 사용합니다.
-
-
구분자로는
-만 지원합니다. -
구분자가 있는 형식에서는
<year>,<month>,<day>의 길이가 달라도 됩니다. 이어 붙인 형식에서는<year>가 2자리 또는 4자리이며, 나머지 필드는 2자리로 고정됩니다.
시간 부분 <time>
-
다음 두 가지 형식이 허용됩니다.
-
구분자가 있는 형식:
HH[:MM[:SS[.fraction]]]등. -
이어 붙인 형식:
HH[MM[SS[.fraction]]]등.
-
-
<hour>: 0–23. -
<minute>: 0–59. -
<second>: 0–59. -
<fraction>: 소수점 뒤에 오는 숫자의 개수에는 제한이 없습니다. 초의 소수 부분을 나타냅니다. 가장 높은 자릿수는 0.1초 자리(백 밀리초)에 해당합니다. -
<hour>,<minute>,<second>는 구분자가 있는 형식에서 1-2자리 숫자를 허용하며, 이어 붙인 형식에서는 길이가 2자리로 고정됩니다. -
왼쪽부터 연속된 필드만 지정하고 나머지 부분을 생략할 수 있습니다. 예를 들어
<hour>+<minute>는 유효하지만,<hour>+<fraction>은 유효하지 않습니다.
연속 숫자 형식 <digit>{14}
-
4자리-2자리-2자리-2자리-2자리-2자리 형식으로 연도, 월, 일, 시, 분, 초로 해석합니다.
-
그다음 소수 부분과 시간대 부분이 있으면 일반 규칙에 따라 파싱합니다.
시간대 부분 <offset>
-
날짜와 시간대 사이에는 모든 공백 문자가 허용됩니다.
-
대소문자를 구분하지 않습니다.
-
다음 세 가지 유형이 허용됩니다.
-
숫자 오프셋:
(+|-)HH[:MM]또는(+|-)HHMM등.-
<hour-offset>: 0–14이며, 한 자리 값에서는 앞의 0을 생략할 수 있습니다. -
<minute-offset>: 00, 30 또는 45이며, ":"는 생략할 수 있습니다. -
숫자 오프셋의 최대 범위는
[-14:00, +14:00]입니다.
-
-
특수 UTC 식별자:
Z/UTC/GMT/CST/ZULU. 각 기호가 나타내는 시간대 오프셋은 다음과 같습니다.-
Z: +00:00 -
UTC: +00:00 -
GMT: +00:00 -
CST: +08:00 -
ZULU: +00:00
-
-
긴 형식의 시간대 이름: IANA가 관리하는 시간대 데이터베이스에 포함된 모든 유효한 시간대 이름입니다. 예를 들어
Europe/Paris,Etc/GMT+2등이 있으며, 대소문자를 구분하지 않습니다.- 시간대 이름의 사용 가능 여부는 시간대 문서를 참조하세요.
-
공백
<whitespace>: 스페이스, 탭, 줄바꿈 등을 포함한 모든 공백 문자입니다.
파싱 로직
<datetime>의 모든 입력 필드가 유효한 입력 문자열에 대해 Doris는 각 필드의 의미에 따라 결과 Datetime의 해당 부분에 값을 채웁니다. 입력은 필드에 따라 결과의 해당 부분에 할당됩니다. 예를 들어 <year>에 일치하는 값은 결과의 연도 부분에 설정되고, <fraction>에 일치하는 값은 결과의 마이크로초 부분에 설정됩니다. 입력에 없는 모든 필드는 결과의 해당 부분에 0으로 설정됩니다.
특히 입력 날짜 결과가 0000년 00월 00일이고 BE CONFIG allow_zero_date가 true이면 값 범위 오류로 처리하지 않으며, 결과는 0000년 01월 01일이 됩니다.
자리 올림
-
<fraction>의 소수 자릿수가<scale>보다 많으면<scale>자리로 반올림합니다. 이 과정에서 자리 올림이 발생하면 정상적으로 전파되어 최종적으로 결과의 어느 부분에든 영향을 줄 수 있습니다. -
입력에
<offset>부분이 있으면 자리 올림이 발생할 수 있습니다.<offset>은 일반적으로 시간 값을 변경합니다. 시 또는 분에서 자리 올림이 발생하면 정상적으로 전파되어 최종적으로 결과의 날짜 부분에 영향을 줍니다. -
<offset>과<fraction>으로 인한 자리 올림은 서로 충돌하지 않으므로 동시에 발생하여 함께 영향을 줄 수 있습니다.
오류 처리
-
형식 오류: 입력이 위의 BNF 분기 중 어느 것과도 일치하지 않으면 즉시 오류를 보고합니다.
-
값 범위 오류: 어느 부분이든 유효하지 않은 값이면(결과가 유효한 그레고리력 날짜 및 시간이 아니면) 오류를 보고합니다.
예제
현재 Doris 시간대가 UTC+8(+08:00)이라고 가정합니다. 시간대가 시간 타입 파싱에 미치는 영향은 시간대 문서를 참조하세요. 결과는 DATETIME(6)을 기준으로 하며, 이는 소수점 이하 6자리를 저장할 수 있는 DATETIME입니다.
| 문자열 | DATETIME(6)으로 변환한 결과 | 설명 |
|---|---|---|
2023-07-16T19:20:30.123+08:00 | 2023-07-16 19:20:30.123000 | 구분자가 있는 날짜 + "T" + 초와 밀리초 + 숫자 오프셋. UTC+8로 변환해도 결과는 그대로입니다. |
2023-07-16T19+08:00 | 2023-07-16 19:00:00.000000 | 이어 붙인 시간 형식으로 분과 초를 생략했습니다. UTC+8로 변환해도 결과는 그대로입니다. |
2023-07-16T1920+08:00 | 2023-07-16 19:20:00.000000 | 이어 붙인 시간 형식으로 초를 생략했습니다. UTC+8로 변환해도 결과는 그대로입니다. |
70-1-1T00:00:00-0000 | 1970-01-01 08:00:00.000000 | 두 자리 연도 + 한 자리/두 자리 월과 일 + 구분자 + 이어 붙인 오프셋. UTC+8로 변환하면 8시간이 더해집니다. |
19991231T235959.5UTC | 2000-01-01 07:59:59.500000 | 이어 붙인 날짜 + "T" + 이어 붙인 시, 분, 초 + 소수 부분 + UTC. UTC+8로 변환하면 8시간이 더해집니다. |
2024-05-01T00:00Asia/Shanghai | 2024-05-01 00:00:00.000000 | 일부가 생략된 시간 + 시간대 이름. UTC+8로 변환해도 결과는 그대로입니다. |
20231005T081530Europe/London | 2023-10-05 15:15:30.000000 | 이어 붙인 날짜 + 시간대 이름. 일광 절약 시간 적용 시 GMT+1이며, 7시간을 더해 UTC+8로 변환합니다. |
20230105T081530 Europe/London | 2023-10-05 16:15:30.000000 | 이어 붙인 날짜 + 시간대 이름. 일광 절약 시간 미적용 시 GMT+0이며, 8시간을 더해 UTC+8로 변환합니다. |
85-12-25T000000gMt | 1985-12-25 08:00:00.000000 | 대소문자가 섞인 시간대. UTC+8로 변환하면 8시간이 더해집니다. |
2024-05-01 | 2024-05-01 00:00:00.000000 | 날짜만 있음 |
24-5-1 | 2024-05-01 00:00:00.000000 | 두 자리 연도 + 한 자리 월과 일 |
2024-05-01 0:1:2.333 | 2024-05-01 00:01:02.333000 | 구분자가 있는 날짜 + "T" + 한 자리 시, 분, 초 + 밀리초 |
2024-05-01 0:1:2. | 2024-05-01 00:01:02.000000 | 구분자가 있는 날짜 + "T" + 한 자리 시, 분, 초 + 소수점 하나 |
20240501 01 | 2024-05-01 01:00:00.000000 | 이어 붙인 날짜 + "T" + 한 자리 시, 분과 초 생략 |
20230716 1920Z | 2023-07-16 19:20:20.000000 | 이어 붙인 날짜 + 공백 + 이어 붙인 시와 분 + UTC "Z" |
2024-05-01T0000 | 2024-05-01 00:00:00.000000 | 구분자가 있는 날짜 + "T" + 이어 붙인 시와 분, 초 생략 |
2024-12-31 23:59:59.9999999 | 2025-01-01 00:00:00.000000 | 연도로 자리 올림 |
2025/06/15T00:00:00.99999999999999 | 2025-06-15 00:00:01.000000 | 소수 자릿수에 제한이 없으며, 정상적으로 자리 올림 발생 |
2025/06/15T00:00:00.9999987 | 2025-06-15 00:00:00.999999 | 마이크로초로 자리 올림 발생 |
2025/06/15T00:00:00.99999849 | 2025-06-15 00:00:00.999998 | 반올림은 바로 다음 자릿수만 고려하며, 마이크로초로 자리 올림이 발생하지 않음. |
2020-12-12 13:12:12-03:00 | 2020-12-13 00:12:12.000000 | 자리 올림 없음 |
0023-01-01T00:00Z | 0023-01-01 08:00:00.000000 | 네 자리 연도는 유효함 |
69-12-31 | 2069-12-31 00:00:00.000000 | 두 자리 연도 69 → 2069-12-31 |
70-01-01 | 1970-01-01 00:00:00.000000 | 두 자리 연도 70 → 1970-01-01 |
230102 | 2023-01-02 00:00:00.000000 | 짧은 연도를 사용하는 DATE 이어 붙인 형식 |
19230101 | 1923-01-01 00:00:00.000000 | 긴 연도를 사용하는 DATE 이어 붙인 형식 |
120102030405 | 오류 (형식 오류) | DATE - TIME 구분자 누락 |
20120102030405.123 +08 | 2012-01-02 03:05:05.123000 | 14자리로 이어 붙인 날짜 형식 + 소수 부분 + 짧은 시간대 오프셋 |
120102030405.999 | 오류 (형식 오류) | DATE - TIME 구분자 누락 |
2023-07-16T19.123+08:00 | 오류 (형식 오류) | 날짜에 연속되지 않은 필드가 있음(시+밀리초로 분과 초를 건너뜀) |
2024/05/01 | 2024-05-01 | 날짜 구분자로 '/' 사용 |
24012 | 오류 (형식 오류) | 날짜의 자릿수가 유효하지 않음 |
2411 123 | 오류 (형식 오류) | 날짜와 시간 부분 모두 자릿수가 유효하지 않음 |
2024-05-01 01:030:02 | 오류 (형식 오류) | 분의 자릿수가 유효하지 않음 |
10000-01-01 00:00:00 | 오류 (형식 오류) | 연도의 자릿수가 유효하지 않음 |
2024-0131T12:00 | 오류 (형식 오류) | 월을 이어 붙인 형식에서 구분자를 혼용함 |
2024-05-01@00:00 | 오류 (형식 오류) | 유효하지 않은 구분자 |
20120212051 | 오류 (형식 오류) | 잘못된 자릿수 |
2024-05-01T00:00XYZ | 일반적으로: 오류 (형식 오류) | 알 수 없는 시간대 약어(시간대 문서 참조) |
2024-5-1T24:00 | 오류 (값 범위 오류) | 시 값 24가 범위를 벗어남 |
2024-02-30 | 오류 (값 범위 오류) | 이월에는 30일이 존재하지 않음 |
2024-05-01T12:60 | 오류 (값 범위 오류) | 분 값 60이 범위를 벗어남 |
2012-06-30T23:59:60 | 오류 (값 범위 오류) | 윤초는 허용되지 않음 |
2024-05-01T00:00+14:30 | 오류 (값 범위 오류) | 시간대 오프셋이 최대 범위를 초과함 |
2024-05-01T00:00+08:25 | 오류 (값 범위 오류) | 시간대 오프셋의 분 값 25가 유효하지 않음 |
9999-12-31 23:59:59.9999999 | 오류 (값 범위 오류) | 소수 자릿수를 줄이면서 발생한 자리 올림으로 결과가 값 범위의 상한을 초과함 |
비엄격 모드
BNF 정의
엄격 모드에서 지원하는 형식 외에 다음 형식도 지원합니다.
<datetime> ::= <whitespace>* <date> (<delimiter> <time> <whitespace>* <timezone>?)? <whitespace>*
<date> ::= <year> <separator> <month> <separator> <day>
<time> ::= <hour> <separator> <minute> <separator> <second> [<fraction>]
<year> ::= <digit>{4} | <digit>{2}
<month> ::= <digit>{1,2}
<day> ::= <digit>{1,2}
<hour> ::= <digit>{1,2}
<minute> ::= <digit>{1,2}
<second> ::= <digit>{1,2}
<separator> ::= ^(<digit> | <alpha>)
<delimiter> ::= " " | "T" | ":"
<fraction> ::= "." <digit>*
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
<offset> ::= ( "+" | "-" ) <hour-offset> [ ":"? <minute-offset> ]
| <special-tz>
| <long-tz>
<hour-offset> ::= <digit>{1,2} ; 0–14
<minute-offset> ::= <digit>{2} ; 00/30/45
<special-tz> ::= "CST" | "UTC" | "GMT" | "ZULU" | "Z" ; case-insensitive
<long-tz> ::= ( ^<whitespace> )+ ; e.g. America/New_York
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
<whitespace> ::= " " | "\t" | "\n" | "\r" | "\v" | "\f"
<digit> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
<alpha> ::= "A" | … | "Z" | "a" | … | "z"
4.0 버전부터 <year> 부분은 2자리 또는 4자리 입력만 지원합니다. 구분자가 없는 날짜나 시간에 대한 지원이 더 엄격해져, 엄격 모드에서 지원하고 비엄격 모드에서도 그대로 지원하는 14자리 연속 정수 형식만 허용합니다.
각 필드를 파싱할 때 길이 제한을 초과하게 하는 불필요한 선행 영은 더 이상 허용되지 않습니다. 예를 들어 00012는 <day> ::= <digit>{1,2}에 대해 유효하지 않습니다.
예상하지 못한 공백을 만나면 이미 파싱한 필드로 결과를 채우지 않고, 다른 예상하지 못한 문자와 마찬가지로 파싱에 실패합니다.
규칙 설명
변환 대상 타입을 DATETIME(<scale>)이라고 가정하며, <scale>의 값 범위는 [0, 6]입니다.
비엄격 모드에서는 엄격 모드에서 지원하는 모든 형식을 파싱할 수 있으며, 위의 BNF 정의에 따른 파싱도 추가로 지원합니다.
전체 구조
-
날짜 부분은 필수이며, 시간 부분과 시간대 부분은 선택 사항입니다.
-
문자열 앞뒤에는 모든 공백 문자를 넣을 수 있습니다. 날짜와 시간은 공백 또는 대문자 "T"로 구분하며, 각 입력 필드는 숫자나 문자가 아닌 모든 기호로 구분할 수 있습니다. 시간대는 선택 사항입니다.
-
ASCII 문자만 허용됩니다. 입력 문자열에 ASCII가 아닌 문자가 있으면 위의 BNF 정의를 충족하지 않으므로 형식 오류로 처리됩니다.
날짜 부분 <date>와 시간 부분 <time>
-
<separator>: 숫자나 문자가 아닌 모든 기호입니다. -
<year>: 2자리 또는 4자리 숫자입니다.-
두 자리 연도(00-99): < 70이면 2000+두 자리 값, ≥ 70이면 1900+두 자리 값으로 해석합니다.
-
네 자리 연도는 그대로 사용합니다.
-
-
<fraction>(선택 사항): 소수점 뒤에 오는 숫자의 개수에는 제한이 없습니다. -
나머지 숫자 필드: 1자리 또는 2자리 숫자입니다.
시간대 부분 <timezone>(엄격 모드와 동일)
-
날짜와 시간대 사이에는 모든 공백 문자가 허용됩니다.
-
대소문자를 구분하지 않습니다.
-
다음 세 가지 유형이 허용됩니다.
-
숫자 오프셋:
(+|-)HH[:MM]또는(+|-)HHMM-
<hour-offset>: 0-14이며, 한 자리 값에서는 앞의 0을 생략할 수 있습니다. -
<minute-offset>: 00, 30 또는 45이며, 콜론 ":"은 생략할 수 있습니다. -
숫자 오프셋의 최대 범위는
[-14:00, +14:00]입니다.
-
-
특수 UTC 식별자:
Z/UTC/GMT/CST/ZULU. 각 기호가 나타내는 시간대 오프셋은 다음과 같습니다.-
Z: +00:00 -
UTC: +00:00 -
GMT: +00:00 -
CST: +08:00 -
ZULU: +00:00
-
-
긴 시간대 이름: IANA 시간대 데이터베이스에 포함된 모든 유효한 시간대 이름입니다. 예를 들어
Europe/Paris,Etc/GMT+2등이 있습니다(대소문자를 구분하지 않음).- 시간대 이름의 사용 가능 여부는 시간대 문서를 참조하세요.
-
공백
<whitespace>: 스페이스, 탭, 줄바꿈 등을 포함한 모든 공백 문자입니다.
파싱 로직
위의 BNF 정의를 충족하는 모든 입력 문자열에 대해 Doris는 결과 Datetime의 해당 부분에 값을 채웁니다. 예를 들어 결과의 연도 부분에는 일치하는 <year> 값을 설정하고, 결과의 마이크로초 부분에는 일치하는 <fraction> 값을 설정합니다. 입력에 없는 부분은 결과에서 0으로 설정됩니다.
특히 입력 날짜 결과가 0000-00-00이고 BE CONFIG allow_zero_date가 true이면 값 범위 오류로 처리하지 않으며, 결과는 0000-01-01로 설정됩니다.
자리 올림
-
<fraction>의 소수 자릿수가<scale>보다 많으면 소수점 이하<scale>자리로 반올림합니다. 이 과정에서 자리 올림이 발생하면 정상적으로 전파되어 결과의 어느 부분에든 영향을 줄 수 있습니다. -
입력에
<offset>부분이 있으면 자리 올림이 발생할 수 있습니다.<offset>은 일반적으로 시간 값을 변경하며, 시 또는 분에서 자리 올림이 발생하면 정상적으로 전파되어 결과의 날짜 부분에 영향을 줍니다. -
<offset>과<fraction>으로 인한 자리 올림은 서로 충돌하지 않으므로 동시에 발생하여 결과에 함께 영향을 줄 수 있습니다.
오류 처리
-
형식 오류: 입력이 위의 BNF 분기 중 어느 것과도 일치하지 않으면 NULL을 반환합니다.
-
값 범위 오류: 어느 부분이든 유효하지 않은 값이면(결과가 유효한 그레고리력 날짜 및 시간이 아니면) NULL을 반환합니다.
예제
현재 Doris 시간대가 UTC+8(+08:00)이라고 가정합니다. 시간대가 시간 타입 파싱에 미치는 영향은 시간대 문서를 참조하세요. 결과는 DATETIME(6)을 기준으로 표시하며, 이는 소수점 이하 6자리를 저장할 수 있는 DATETIME 타입입니다.
| 문자열 | DATETIME(6)으로 변환한 결과 | 설명 |
|---|---|---|
2023-7-4T9-5-3.1Z | 2023-07-04 17:05:03.100000 | 앞뒤 공백이 있음. 날짜와 시간의 각 필드는 -로 구분하고 두 부분은 T로 구분하며, 시간대는 Z 시간대(0 시간대)입니다. |
99.12.31 23.59.59+05:30 | 2000-01-01 02:29:59.000000 | 날짜와 시간의 각 필드를 .으로 구분함. 시간대는 +05:30(분 값 30은 유효함)이며, "T"는 없습니다. |
2000/01/01T00/00/00-230 | 2000-01-01 10:30:00.000000 | / 구분자. 시간대에 콜론이 없고 시가 1자리인 -230입니다. |
85 1 1T0 0 0. cst | 1985-01-01 00:00:00.000000 | 모든 필드를 공백으로 구분함. 두 자리 연도는 1985로 매핑되며, 소수점 뒤에 숫자가 없습니다. 짧은 시간대 이름은 대소문자를 구분하지 않습니다. |
2024-02-29T23:59:59.999999 UTC | 2024-03-01 07:59:59.999999 | 유효한 윤년. 자리 올림이 없는 높은 정밀도의 소수 부분과 특정 시간대 이름입니다. |
70-01-01T00:00:00+14 | 1969-12-31 18:00:00.000000 | 두 자리 연도 1970. 유효한 최대 오프셋 +14이며, 분 부분은 없습니다. |
0023-1-1T1:2:3. -00:00 | 0023-01-01 09:07:46.000000 | 네 자리 연도 0023. 한 자리/두 자리 시간 필드를 혼용하며, 소수점 뒤에 숫자가 없습니다. 오프셋의 분에는 부호가 없습니다. |
2025/06/15T00:00:00.0-0 | 2025-06-15 08:00:00.000000 | / 구분자. 소수점 뒤에 1자리 숫자가 있으며, 오프셋은 -0(-00:00과 동일)입니다. |
2025/06/15T00:00:00.99999999999 | 2025-06-15 00:00:01.000000 | 소수 자릿수에 제한이 없으며, 소수점 이하 6자리로 반올림하면서 자리 올림 발생 |
2024-02-29T23-59-60ZULU | NULL (형식 오류) | 초가 범위를 벗어남 |
2024 12 31T121212.123456 America/New_York | NULL (형식 오류) | 구분자 없이 숫자로만 구성된 시간 |
123.123 | NULL (형식 오류) | 동작 변경: 이전에는 2012-03-12 03:00:00.000000을 나타냈으나 이제 지원하지 않습니다. |
12121 | NULL (형식 오류) | 동작 변경: 이전에는 2012-12-12 00:00:00.000000을 나타냈으나 이제 지원하지 않습니다. |
Numeric에서 변환
모든 수치형 타입은 DATETIME 타입으로 변환할 수 있습니다.
4.0 버전부터 DECIMAL 타입은 숫자 리터럴 표현에 따라 변환됩니다. Boolean 타입을 시간 타입으로 변환하는 것은 지원하지 않습니다. 수치형 타입 입력의 소수 부분 파싱을 지원합니다.
엄격 모드
규칙 설명
유효한 형식
정수 부분은 날짜의 맨 오른쪽에서 왼쪽으로, 낮은 자릿수부터 높은 자릿수 순서로 채웁니다. 다음은 유효한 형식과 각 형식에 따라 채워지는 결과입니다(마이크로초 부분 제외).
3-digit number (abc) => 2000 Year 0a Month bc Day
4-digit number (abcd) => 2000 Year ab Month cd Day
5-digit number (abcde) => 200a Year bc Month de Day
6-digit number (abcdef, where ab >= 70) => 19ab Year cd Month ef Day
6-digit number (abcdef, where ab < 70) => 20ab Year cd Month ef Day
8-digit number (abcdefgh) => abcd Year ef Month gh Day
14-digit number (abcdefghijklmn) => abcd Year ef Month gh Day ij Hour kl Minute mn Second
소수 부분은 날짜의 소수점 뒤 맨 왼쪽(백 밀리초 자리)에서 시작하여 높은 자릿수부터 낮은 자릿수 순서로 채웁니다. 소수가 정확하게 표현되지 않는 타입(float, double)이면 Cast 전에 해당 값이 실제로 나타내는 값을 사용합니다.
자리 올림
소수 자릿수가 <scale>보다 많으면 소수점 이하 <scale>자리로 반올림합니다. 이 과정에서 자리 올림이 발생하면 정상적으로 전파되어 결과의 어느 부분에든 영향을 줄 수 있습니다.
오류 처리
규칙에 따라 입력을 유효한 DATETIME 값으로 파싱할 수 없으면 오류를 보고합니다.
예제
결과는 DATETIME(6)을 기준으로 표시하며, 이는 소수점 이하 6자리를 저장할 수 있는 DATETIME 타입입니다.
| 숫자 | DATETIME(6)으로 변환한 결과 | 설명 |
|---|---|---|
123.123 | 2000-01-23 00:00:00.123000 | 3자리 숫자 + 소수 부분 |
20150102030405 | 2015-01-02 03:04:05.000000 | 14자리 숫자 |
20150102030405.123456 | 2015-01-02 03:04:05.123456 | 14자리 숫자 + 소수 부분 |
20151231235959.99999999999 | 2016-01-01 00:00:00.000000 | 14자리 숫자, 유효한 소수 부분, 연도로 자리 올림 |
1000 | 오류 | 2000-10-00의 일 값이 유효하지 않음 |
-123.123 | 오류 | 음수 시간으로는 유효한 날짜를 생성할 수 없음 |
비엄격 모드
오류 처리를 제외하면 비엄격 모드의 동작은 엄격 모드와 완전히 동일합니다.
규칙 설명
유효한 형식
정수 부분은 날짜의 맨 오른쪽에서 왼쪽으로, 낮은 자릿수부터 높은 자릿수 순서로 채웁니다. 다음은 유효한 형식과 각 형식에 따라 채워지는 결과입니다(마이크로초 부분 제외).
3-digit number (abc) => 2000 Year 0a Month bc Day
4-digit number (abcd) => 2000 Year ab Month cd Day
5-digit number (abcde) => 200a Year bc Month de Day
6-digit number (abcdef, where ab >= 70) => 19ab Year cd Month ef Day
6-digit number (abcdef, where ab < 70) => 20ab Year cd Month ef Day
8-digit number (abcdefgh) => abcd Year ef Month gh Day
14-digit number (abcdefghijklmn) => abcd Year ef Month gh Day ij Hour kl Minute mn Second
소수 부분은 날짜의 소수점 뒤 맨 왼쪽(백 밀리초 자리)에서 시작하여 높은 자릿수부터 낮은 자릿수 순서로 채웁니다. 소수가 정확하게 표현되지 않는 타입(float, double)이면 Cast 전에 해당 값이 실제로 나타내는 값을 사용합니다.
자리 올림
소수 자릿수가 <scale>보다 많으면 소수점 이하 <scale>자리로 반올림합니다. 이 과정에서 자리 올림이 발생하면 정상적으로 전파되어 결과의 어느 부분에든 영향을 줄 수 있습니다.
오류 처리
규칙에 따라 입력을 유효한 DATETIME 값으로 파싱할 수 없으면 NULL을 반환합니다.
예제
결과는 DATETIME(6)을 기준으로 표시하며, 이는 소수점 이하 6자리를 저장할 수 있는 DATETIME 타입입니다.
| 숫자 | DATETIME(6)으로 변환한 결과 | 설명 |
|---|---|---|
123.123 | 2000-01-23 00:00:00.123000 | 3자리 숫자 + 소수 부분 |
20150102030405 | 2015-01-02 03:04:05.000000 | 14자리 숫자 |
20150102030405.123456 | 2015-01-02 03:04:05.123456 | 14자리 숫자 + 소수 부분 |
20151231235959.99999999999 | 2016-01-01 00:00:00.000000 | 14자리 숫자, 유효한 소수 부분, 연도로 자리 올림 |
1000 | NULL | 2000-10-00의 일 값이 유효하지 않음 |
-123.123 | NULL | 음수 시간으로는 유효한 날짜를 생성할 수 없음 |
날짜 계열 타입에서 변환
Date, Time, Timestamptz 타입은 Datetime 타입으로 변환할 수 있습니다. Datetime은 여러 정밀도를 지원하므로 정밀도가 다른 Datetime 타입 사이의 변환도 가능합니다.
Timestamptz를 Datetime으로 변환할 때는 현재 세션의 시간대를 기준으로 변환합니다.
Date
규칙 설명
Date에서 변환하면 입력의 날짜 부분에 모든 값이 0인 시간 부분을 더한 결과가 됩니다. 이 변환은 항상 유효합니다.
예제
| 입력 DATE | 대상 타입 | Datetime으로 변환한 결과 |
|---|---|---|
| 2012-02-05 | Datetime(0) | 2012-02-05 00:00:00 |
| 2012-02-05 | Datetime(6) | 2012-02-05 00:00:00.000000 |
Time
규칙 설명
Time에서 변환하면 현재 날짜의 00:00:00 시각에 Time 입력을 더한 결과가 됩니다. 이 변환은 예측 가능한 미래(9999년 십이월 이전)까지 유효하므로 Doris는 항상 유효한 것으로 간주합니다.
예제
현재 날짜가 2025-04-29라고 가정하면 다음과 같습니다.
| 입력 TIME | DATETIME(0)으로 변환한 결과 |
|---|---|
500:00:00 | 2025-05-19 20:00:00 |
23:59:59 | 2025-04-29 23:59:59 |
Datetime
엄격 모드
규칙 설명
낮은 정밀도에서 높은 정밀도로 변환하면 새로 생기는 소수 자릿수를 0으로 채우며, 이 변환은 항상 유효합니다.
높은 정밀도에서 낮은 정밀도로 변환하면 자리 올림이 발생할 수 있으며, 더 높은 자리로 계속 전파될 수 있습니다. 오버플로가 발생하면 변환된 값은 유효하지 않습니다.
오류 처리
오버플로가 발생하면 오류를 보고합니다.
예제
현재 날짜가 2025-04-29라고 가정하면 다음과 같습니다.
| 입력 DATETIME | 원본 타입 | 대상 타입 | 결과 DATETIME | 설명 |
|---|---|---|---|---|
2020-12-12 00:00:00.123 | Datetime(3) | Datetime(6) | 2020-12-12 00:00:00.123000 | 정밀도 증가 |
2020-12-12 00:00:00.123456 | Datetime(6) | Datetime(3) | 2020-12-12 00:00:00.123 | 정밀도 감소, 자리 올림 없음 |
2020-12-12 00:00:00.99666 | Datetime(6) | Datetime(2) | 2020-12-12 00:00:01.00 | 정밀도 감소, 초로 자리 올림 |
9999-12-31 23:59:59.999999 | Datetime(6) | Datetime(5) | 오류 | 자리 올림으로 인한 오버플로로 유효하지 않은 10000년 날짜 생성 |
비엄격 모드
오류 처리를 제외하면 비엄격 모드의 동작은 엄격 모드와 완전히 동일합니다.
규칙 설명
낮은 정밀도에서 높은 정밀도로 변환하면 새로 생기는 소수 자릿수를 0으로 채우며, 이 변환은 항상 유효합니다.
높은 정밀도에서 낮은 정밀도로 변환하면 자리 올림이 발생할 수 있으며, 더 높은 자리로 계속 전파될 수 있습니다. 오버플로가 발생하면 변환된 값은 유효하지 않습니다.
오류 처리
오버플로가 발생하면 NULL을 반환합니다.
예제
현재 날짜가 2025-04-29라고 가정하면 다음과 같습니다.
| 입력 DATETIME | 원본 타입 | 대상 타입 | 결과 DATETIME | 설명 |
|---|---|---|---|---|
2020-12-12 00:00:00.123 | Datetime(3) | Datetime(6) | 2020-12-12 00:00:00.123000 | 정밀도 증가 |
2020-12-12 00:00:00.123456 | Datetime(6) | Datetime(3) | 2020-12-12 00:00:00.123 | 정밀도 감소, 자리 올림 없음 |
2020-12-12 00:00:00.99666 | Datetime(6) | Datetime(2) | 2020-12-12 00:00:01.00 | 정밀도 감소, 초로 자리 올림 |
9999-12-31 23:59:59.999999 | Datetime(6) | Datetime(5) | NULL | 자리 올림으로 인한 오버플로로 유효하지 않은 10000년 날짜 생성 |
Timestamptz
엄격 모드
규칙 설명
낮은 정밀도에서 높은 정밀도로 변환하면 새로 생기는 소수 자릿수를 0으로 채우며, 이 변환은 항상 유효합니다.
높은 정밀도에서 낮은 정밀도로 변환하면 자리 올림이 발생할 수 있으며, 더 높은 자리로 계속 전파될 수 있습니다. 오버플로가 발생하면 변환된 값은 유효하지 않습니다.
오류 처리
오버플로가 발생하면 오류를 보고합니다.
예제
| 입력 TIMESTAMPTZ | 원본 타입 | 대상 타입 | 결과 DATETIME | 설명 |
|---|---|---|---|---|
2020-12-12 00:00:00.123+08:00 | Timestamptz(3) | Datetime(6) | 2020-12-12 00:00:00.123000 | 정밀도 증가 |
2020-12-12 00:00:00.123456+08:00 | Timestamptz(6) | Datetime(3) | 2020-12-12 00:00:00.123 | 정밀도 감소, 자리 올림 없음 |
2020-12-12 00:00:00.99666+08:00 | Timestamptz(6) | Datetime(2) | 2020-12-12 00:00:01.00 | 정밀도 감소, 초로 자리 올림 |
9999-12-31 23:59:59.999999+08:00 | Timestamptz(6) | Datetime(5) | 오류 | 자리 올림으로 인한 오버플로로 유효하지 않은 10000년 날짜 생성 |
비엄격 모드
오류 처리를 제외하면 비엄격 모드의 동작은 엄격 모드와 완전히 동일합니다.
규칙 설명
낮은 정밀도에서 높은 정밀도로 변환하면 새로 생기는 소수 자릿수를 0으로 채우며, 이 변환은 항상 유효합니다.
높은 정밀도에서 낮은 정밀도로 변환하면 자리 올림이 발생할 수 있으며, 더 높은 자리로 계속 전파될 수 있습니다. 오버플로가 발생하면 변환된 값은 유효하지 않습니다.
오류 처리
오버플로가 발생하면 NULL을 반환합니다.
예제
| 입력 TIMESTAMPTZ | 원본 타입 | 대상 타입 | 결과 DATETIME | 설명 |
|---|---|---|---|---|
2020-12-12 00:00:00.123+08:00 | Timestamptz(3) | Datetime(6) | 2020-12-12 00:00:00.123000 | 정밀도 증가 |
2020-12-12 00:00:00.123456+08:00 | Timestamptz(6) | Datetime(3) | 2020-12-12 00:00:00.123 | 정밀도 감소, 자리 올림 없음 |
2020-12-12 00:00:00.99666+08:00 | Timestamptz(6) | Datetime(2) | 2020-12-12 00:00:01.00 | 정밀도 감소, 초로 자리 올림 |
9999-12-31 23:59:59.999999+08:00 | Timestamptz(6) | Datetime(5) | NULL | 자리 올림으로 인한 오버플로로 유효하지 않은 10000년 날짜 생성 |
TIMESTAMP_NS
TIMESTAMP_NS는 DATETIME과 마찬가지로 시간대 정보가 없으므로, 변환 시 시간대 조정 없이 현지 날짜와 시간을 보존합니다. TIMESTAMP_NS의 소수 자릿수는 항상 아홉 자리이고 DATETIME은 최대 여섯 자리까지 지원하므로, 소수 부분을 대상 DATETIME 정밀도로 반올림합니다. 자리 올림은 다음 초로 전파될 수 있습니다.
유효한 모든 TIMESTAMP_NS 값은 DATETIME의 날짜 범위 안에 있으므로, 엄격 모드와 비엄격 모드 모두에서 변환이 항상 성공합니다. NULL 입력은 NULL을 반환합니다.
| 입력 TIMESTAMP_NS | 대상 타입 | 결과 DATETIME | 설명 |
|---|---|---|---|
2024-02-29 12:34:56.123456499 | Datetime(6) | 2024-02-29 12:34:56.123456 | 버려지는 자릿수에 따라 내림 |
2024-02-29 12:34:56.123456500 | Datetime(6) | 2024-02-29 12:34:56.123457 | 버려지는 자릿수에 따라 올림 |
1969-12-31 23:59:59.999999500 | Datetime(6) | 1970-01-01 00:00:00.000000 | 다음 초와 날짜로 자리 올림 |
2024-02-29 12:34:56.123456789 | Datetime(3) | 2024-02-29 12:34:56.123 | 밀리초 정밀도로 반올림 |