DATETIME 타입으로 변환
DATETIME 타입의 유효 범위:
[0000-01-01 00:00:00.000000, 9999-12-31 23:59:59.999999]
DATETIME 타입에는 소수 자릿수를 나타내는 타입 매개변수 p가 있습니다. 전체 표기는 DATETIME(p) 타입입니다. 예를 들어 DATETIME(6)은 마이크로초 정밀도를 지원하는 DATETIME 타입을 나타냅니다.
문자열에서 변환
엄격 모드
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)이라고 가정합니다. 시간대가 시간 타입 파싱에 미치는 영향은 시간대 문서를 참조하세요. 결과는 소수 6자리를 표현할 수 있는 DATETIME 타입인 DATETIME(6)을 예로 들어 표시합니다.
| 문자열 | 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)이라고 가정합니다. 시간대가 시간 타입 파싱에 미치는 영향은 시간대 문서를 참조하세요. 결과는 소수 6자리를 표현할 수 있는 DATETIME 타입인 DATETIME(6)을 사용하여 표시합니다.
| 문자열 | 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을 나타냈으나, 이제는 지원하지 않습니다. |
숫자 타입에서 변환
모든 숫자 타입은 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)이면 변환 전 해당 값이 실제로 나타내는 값을 사용합니다.
올림
소수 자릿수가 <scale>보다 많으면 소수 <scale>자리로 반올림합니다. 이 과정에서 올림이 발생하면 정상적으로 처리되며, 결과의 어느 부분에든 영향을 줄 수 있습니다.
오류 처리
규칙에 따라 입력을 유효한 DATETIME 값으로 파싱할 수 없으면 오류를 보고합니다.
예제
결과는 소수 6자리를 표현할 수 있는 DATETIME 타입인 DATETIME(6)을 사용하여 표시합니다.
| 숫자 | 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)이면 변환 전 해당 값이 실제로 나타내는 값을 사용합니다.
올림
소수 자릿수가 <scale>보다 많으면 소수 <scale>자리로 반올림합니다. 이 과정에서 올림이 발생하면 정상적으로 처리되며, 결과의 어느 부분에든 영향을 줄 수 있습니다.
오류 처리
규칙에 따라 입력을 유효한 DATETIME 값으로 파싱할 수 없으면 NULL을 반환합니다.
예제
결과는 소수 6자리를 표현할 수 있는 DATETIME 타입인 DATETIME(6)을 사용하여 표시합니다.
| 숫자 | 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년 날짜가 생성됨 |