TIME 타입으로 변환
TIME 타입의 유효 범위는 [-838:59:59.999999, 838:59:59.999999]입니다.
TIME 타입에는 소수 자릿수를 나타내는 타입 매개변수 p가 있습니다. 전체 표기는 TIME(p) 타입입니다. 예를 들어 TIME(6)은 마이크로초 정밀도를 지원하는 TIME 타입을 나타냅니다.
String에서 변환
4.0 버전부터 TIME 타입 파싱은 이 문서에서 설명하는 형식만 지원하며, Datetime 타입에서 허용하는 규칙을 통한 추가 변환을 더 이상 시도하지 않습니다.
엄격 모드
BNF 정의
<time> ::= ("+" | "-")? (<colon-format> | <numeric-format>)
<colon-format> ::= <hour> ":" <minute> (":" <second> (<microsecond>)?)?
<hour> ::= <digit>+
<minute> ::= <digit>{1,2}
<second> ::= <digit>{1,2}
<numeric-format> ::= <digit>+ (<microsecond>)?
<microsecond> ::= "." <digit>*
<digit> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
규칙 설명
전체 구조
<colon-format>과 <numeric-format>의 두 가지 형식을 지원합니다.
-
맨 앞에는 결과의 부호를 나타내는 더하기 또는 빼기 기호가 선택적으로 올 수 있습니다.
-
<colon-format>은 다음 순서로 구성됩니다.-
<hour>: 0-23. 한 자리 이상이어야 하며, INT 범위를 초과해서는 안 됩니다. -
<minute>: 0-59. 한 자리 또는 두 자리이며, 구분자:로<hour>와 구분해야 합니다. -
<second>: 선택 사항. 0-59. 한 자리 또는 두 자리이며, 구분자:로<minute>와 구분해야 합니다. 기본값은 0입니다. -
<microsecond>: 선택 사항..으로 시작하고 그 뒤에는 자릿수 제한 없이 숫자가 올 수 있습니다. 기본값은 0입니다.
-
-
<numeric-format>은 다음 순서로 구성됩니다.-
연속된 숫자로 이루어진 문자열로, 시, 분, 초 필드가 이어진 값으로 처리합니다. 오른쪽을 기준으로 정렬하므로 입력의 일의 자리가 결과의 초의 일의 자리에 대응하고, 나머지는 왼쪽으로 차례로 채워집니다. 예를 들어 입력의 천의 자리는 결과의 분의 십의 자리에 대응합니다.
-
<microsecond>필드와 같은 선택적 소수부입니다. 소수 자릿수가p를 초과하면 소수점 이하p자리로 반올림합니다.
-
오류 처리
-
형식 오류: 위 BNF의 어느 분기에도 부합하지 않으면 즉시 오류를 보고합니다.
-
값 범위 오류: 결과가 유효한 시간이 아니거나 TIME 타입의 값 범위를 초과하면 오류를 보고합니다.
예제
| 문자열 | TIME(6)으로 변환한 결과 | 설명 |
|---|---|---|
1 | 00:00:01.000000 | 일의 자리를 초의 일의 자리에 맞춤 |
123 | 00:01:23.000000 | 일의 자리를 초의 일의 자리에 맞추고 왼쪽으로 채움 |
2005959.12 | 200:59:59.120000 | 소수가 포함된 입력 |
0.12 | 00:00:00.120000 | 숫자 형식의 0 시간 입력 + 소수부 |
00:00:00.12 | 00:00:00.120000 | 구분자가 있는 형식의 0 시간 입력 + 소수부 |
123. | 00:01:23.000000 | 소수부의 자릿수로 0자리 허용 |
123.0 | 00:01:23.000000 | 소수부가 1자리이며 값은 0 |
123.123 | 00:01:23.123000 | 유효한 소수부 |
-1 | -00:00:01.000000 | 음수 입력 |
12-34:56.1 | 오류 (형식 오류) | '-'는 유효한 구분자가 아님 |
12 : 34 : 56 | 오류 (형식 오류) | 유효하지 않은 공백 |
76 | 오류 (값 범위 오류) | 76초는 유효하지 않음 |
200595912 | 오류 (값 범위 오류) | 20059시간은 유효하지 않음 |
8385959.9999999 | 오류 (값 범위 오류) | 자리 올림으로 상한 초과 |
비엄격 모드
4.0부터 DECIMAL 타입은 리터럴 값 표현에 따라 변환됩니다. <microsecond> 필드를 마이크로초로 파싱할 수 있습니다. 범위를 벗어나는 모든 형식은 오류로 간주하고 그에 따라 처리합니다.
비엄격 모드는 앞뒤 공백을 지원하며, 오류 처리 방식이 엄격 모드와 다릅니다.
BNF 정의
<time> ::= <whitespace>* ("+" | "-")? (<colon-format> | <numeric-format>) <whitespace>*
<colon-format> ::= <hour> ":" <minute> (":" <second> (<microsecond>)?)?
<hour> ::= <digit>+
<minute> ::= <digit>{1,2}
<second> ::= <digit>{1,2}
<numeric-format> ::= <digit>+ (<microsecond>)?
<microsecond> ::= "." <digit>*
<digit> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
<whitespace> ::= " " | "\t" | "\n" | "\r" | "\v" | "\f"
규칙 설명
전체 구조
<colon-format>과 <numeric-format>의 두 가지 형식을 지원합니다.
-
시간의 부호를 나타내는 기호가 선택적으로 올 수 있습니다.
-
<colon-format>은 다음과 같이 구성됩니다.-
<hour>: 0-23. 한 자리 이상이어야 하며, INT 범위를 초과해서는 안 됩니다. -
<minute>: 0-59. 한 자리 또는 두 자리이며,:로 구분합니다. -
<second>: 선택 사항. 0-59. 한 자리 또는 두 자리이며,:로 구분합니다. -
<microsecond>: 선택 사항..으로 시작하고 그 뒤에는 자릿수 제한 없이 숫자가 올 수 있습니다.
-
-
<numeric-format>은 다음과 같이 구성됩니다.-
연속된 숫자로 이루어진 문자열로, 시, 분, 초 필드가 이어진 값으로 처리합니다. 맨 오른쪽 숫자를 초 필드에 맞추고 나머지는 오른쪽에서 왼쪽으로 채웁니다.
-
<microsecond>와 같은 선택적 소수부입니다. 자릿수가 초과하면 지정된 소수점 이하p자리로 반올림합니다.
-
오류 처리
-
형식 오류: BNF의 어느 분기에도 일치하지 않으면 NULL을 반환합니다.
-
값 범위 오류: 결과가 유효한 시간이 아니거나 TIME 타입의 범위를 초과하면 NULL을 반환합니다.
예제
| 입력 문자열 | TIME(6)으로 변환한 결과 | 설명 |
|---|---|---|
1 | 00:00:01.000000 | 맨 오른쪽 숫자를 초에 맞춤 |
123 | 00:01:23.000000 | 맨 오른쪽 숫자를 초에 맞추고 오른쪽에서 왼쪽으로 채움 |
2005959.12 | 200:59:59.120000 | 소수가 포함된 입력 |
0.12 | 00:00:00.120000 | 숫자 형식의 0 시간 입력 + 소수부 |
00:00:00.12 | 00:00:00.120000 | 콜론 형식의 0 시간 입력 + 소수부 |
123. | 00:01:23.000000 | 소수부의 자릿수로 0자리 허용 |
123.0 | 00:01:23.000000 | 소수부가 1자리이며 값은 0 |
123.123 | 00:01:23.123000 | 유효한 소수부 |
-1 | -00:00:01.000000 | 음수 입력 |
-800:05:05 | -800:05:05.000000 | 시간이 3자리인 음수 |
-991213.56 | -99:12:13.560000 | 음수 입력 |
80302.9999999 | 08:03:03.000000 | 소수 자릿수가 6을 초과하여 자리 올림 발생 |
5656.3000000009 | 00:56:56.300000 | 소수부의 하위 자릿수 버림 |
5656.3000007001 | 00:56:56.300001 | 마이크로초 단위로 반올림 |
1 | NULL | 유효하지 않은 형식으로, BNF가 공백과 일치하지 않음 |
.123 | NULL | 소수점 앞에 필드가 없음 |
:12:34 | NULL | 시간 필드 누락 |
12-34:56.1 | NULL | '-'는 유효한 구분자가 아님 |
12 : 34 : 56 | NULL | 유효하지 않은 공백 |
76 | NULL | 76초는 유효하지 않음 |
200595912 | NULL | 20059시간은 유효하지 않음 |
8385959.9999999 | NULL | 자리 올림으로 상한 초과 |
숫자 타입에서 변환
모든 숫자 타입을 TIME 타입으로 변환할 수 있습니다.
4.0 버전부터 Doris는 소수부 파싱을 지원하며, 모든 숫자 타입을 Time 타입으로 변환할 수 있습니다.
엄격 모드
규칙 설명
유효한 형식
정수부의 숫자는 낮은 자리부터 높은 자리 순으로, 날짜의 맨 오른쪽에서 왼쪽으로 채웁니다. 유효한 형식과 각 형식에 따른 결과는 다음과 같습니다(마이크로초 부분 제외).
1-digit number(a) 00:00:0a
2-digit number(ab) 00:00:ab
3-digit number(abc) 00:0a:bc
4-digit number(abcd) 00:ab:cd
5-digit number(abcde) 0a:bc:de
6-digit number(abcdef) ab:cd:ef
7-digit number(abcdefg) abc:de:fg
소수부의 숫자는 높은 자리부터 낮은 자리 순으로, 소수점 다음 맨 왼쪽(백 밀리초 자리)에서 오른쪽으로 채웁니다. 소수가 정확하게 표현되지 않는 타입(float, double)이면 Cast 전의 실제 값을 그대로 사용합니다. 소수 자릿수가 p를 초과하면 소수점 이하 p자리로 반올림합니다.
입력이 음수이면 파싱한 값의 부호를 반대로 바꾼 결과를 반환합니다.
오류 처리
규칙에 따라 입력을 유효한 TIME 값으로 파싱할 수 없으면 오류를 보고합니다.
예제
| 숫자 | TIME(3)으로 변환한 결과 | 설명 |
|---|---|---|
123456 | 12:34:56.000 | |
-123456 | -12:34:56.000 | |
123 | 00:01:23.000 | |
6.99999 | 00:00:07.000 | |
-0.99 | -00:00:00.990 | |
8501212 | 850:12:12.000 | |
20001212 | 오류 | 길이가 범위를 벗어남 |
9000000 | 오류 | 시간 값 900이 상한을 초과함 |
67 | 오류 | 초 값 67이 유효하지 않음 |
비엄격 모드
오류 처리를 제외하면 비엄격 모드의 동작은 엄격 모드와 완전히 동일합니다.
규칙 설명
유효한 형식
정수부의 숫자는 낮은 자리부터 높은 자리 순으로, 시간의 맨 오른쪽에서 왼쪽으로 채웁니다. 유효한 형식과 각 형식에 따른 결과는 다음과 같습니다(마이크로초 부분 제외).
1-digit number(a) 00:00:0a
2-digit number(ab) 00:00:ab
3-digit number(abc) 00:0a:bc
4-digit number(abcd) 00:ab:cd
5-digit number(abcde) 0a:bc:de
6-digit number(abcdef) ab:cd:ef
7-digit number(abcdefg) abc:de:fg
소수부의 숫자는 높은 자리부터 낮은 자리 순으로, 날짜에서 소수점 다음 맨 왼쪽(백 밀리초 자리)부터 채웁니다. 소수가 부정확하게 표현되는 타입(float, double)이면 Cast 전에 해당 값이 실제로 나타내는 값을 사용합니다.
입력이 음수이면 파싱한 값의 부호를 반대로 바꾼 결과를 반환합니다.
오류 처리
규칙에 따라 입력을 유효한 TIME 값으로 파싱할 수 없으면 NULL을 반환합니다.
예제
| 숫자 | TIME(3)으로 변환한 결과 | 설명 |
|---|---|---|
123456 | 12:34:56.000 | |
-123456 | -12:34:56.000 | |
123 | 00:01:23.000 | |
6.99999 | 00:00:07.000 | |
-0.99 | -00:00:00.990 | |
8501212 | 850:12:12.000 | |
20001212 | NULL | 길이가 범위를 벗어남 |
9000000 | NULL | 시간 값 900이 상한을 초과함 |
67 | NULL | 초 값 67이 유효하지 않음 |
날짜 및 시간 계열 타입에서 변환
Datetime에서 변환
4.0 버전부터 Datetime 타입에서 Time 타입으로의 변환을 지원합니다.
결과는 입력의 시간 부분이며, 이 변환은 항상 유효합니다.
예제
| 입력 DATETIME | TIME(4)으로 변환한 결과 |
|---|---|
2012-02-05 12:12:12.123456 | 12:12:12.1235 |
Time에서 변환
엄격 모드
규칙 설명
정밀도가 낮은 타입에서 높은 타입으로 변환하면 새로 생기는 소수 자릿수를 0으로 채우며, 이 변환은 항상 유효합니다.
정밀도가 높은 타입에서 낮은 타입으로 변환할 때는 자리 올림이 발생할 수 있으며, 앞자리로 계속 전파될 수 있습니다. 오버플로가 발생하면 변환된 값은 유효하지 않습니다.
오류 처리
오버플로가 발생하면 오류를 보고합니다.
예제
현재 날짜가 2025-04-29라고 가정하면 다음과 같습니다.
| 입력 TIME | 원본 타입 | 대상 타입 | 결과 TIME | 설명 |
|---|---|---|---|---|
00:00:00.123 | TIME(3) | TIME(6) | 00:00:00.123000 | 정밀도 증가 |
00:00:00.123456 | TIME(6) | TIME(3) | 00:00:00.123 | 정밀도 감소, 자리 올림 없음 |
120:00:00.99666 | TIME(6) | TIME(2) | 120:00:01.00 | 정밀도 감소, 초 단위로 자리 올림 |
838:59:59.999999 | TIME(6) | TIME(5) | 오류 | 자리 올림으로 오버플로가 발생하여 유효하지 않은 TIME 생성 |
비엄격 모드
오류 처리를 제외하면 비엄격 모드의 동작은 엄격 모드와 완전히 동일합니다.
규칙 설명
정밀도가 낮은 타입에서 높은 타입으로 변환하면 새로 생기는 소수 자릿수를 0으로 채우며, 이 변환은 항상 유효합니다.
정밀도가 높은 타입에서 낮은 타입으로 변환할 때는 자리 올림이 발생할 수 있으며, 앞자리로 계속 전파될 수 있습니다. 오버플로가 발생하면 변환된 값은 유효하지 않습니다.
오류 처리
오버플로가 발생하면 NULL을 반환합니다.
예제
| 입력 TIME | 원본 타입 | 대상 타입 | 결과 TIME | 설명 |
|---|---|---|---|---|
00:00:00.123 | TIME(3) | TIME(6) | 00:00:00.123000 | 정밀도 증가 |
00:00:00.123456 | TIME(6) | TIME(3) | 00:00:00.123 | 정밀도 감소, 자리 올림 없음 |
120:00:00.99666 | TIME(6) | TIME(2) | 120:00:01.00 | 정밀도 감소, 초 단위로 자리 올림 |
838:59:59.999999 | TIME(6) | TIME(5) | NULL | 자리 올림으로 오버플로가 발생하여 유효하지 않은 TIME 생성 |