TIMESTAMP_NS 타입으로 변환
설명
TIMESTAMP_NS의 정밀도는 나노초로 고정되어 있으며, 정확한 범위는 [1677-09-21 00:12:43.145224192, 2262-04-11 23:47:16.854775807]입니다. 정밀도 매개변수는 허용하지 않습니다.
문자열과 숫자 값은 일반적으로 DATETIME과 동일한 필드 매핑을 사용합니다. 엄격 변환 모드와 비엄격 변환 모드 모두에서 TIMESTAMP_NS는 해당 모드의 DATETIME과 정확히 동일한 문자열 형식을 지원합니다. 문자열 형식 지원 범위에서 유일한 차이는 TIMESTAMP_NS가 소수 초 정밀도를 최대 아홉 자리까지 지원하는 반면, DATETIME은 최대 여섯 자리까지 지원한다는 점입니다.
구문
CAST(<source_expr> AS TIMESTAMP_NS)
TRY_CAST(<source_expr> AS TIMESTAMP_NS)
지원되는 원본 타입
| 원본 타입 | 변환 동작 |
|---|---|
CHAR, VARCHAR, STRING | 해당하는 엄격 또는 비엄격 DATETIME 문자열 문법을 사용하여 날짜·시간 문자열을 파싱하며, 소수 초 정밀도를 최대 아홉 자리까지 지원합니다. |
| 정수 타입 | 값을 축약 형식의 날짜 또는 날짜·시간으로 해석합니다. |
FLOAT | 단정밀도 입력이 실제로 표현하는 값을 사용합니다. 유효 자릿수가 손실되면 큰 축약 날짜·시간 값이 유효하지 않게 될 수 있습니다. |
DOUBLE | 배정밀도 입력이 실제로 표현하는 값을 사용하며, 소수부는 소수 초를 나타냅니다. |
DECIMAL 타입 | 정수부를 축약 형식의 날짜 또는 날짜·시간으로, 소수부를 소수 초로 해석합니다. |
DATE | 00:00:00.000000000을 추가합니다. |
DATETIME(p) | 달력상의 날짜와 시간을 유지하고 소수부가 아홉 자리가 되도록 영을 채웁니다. |
TIME(p) | 현재 날짜의 자정에 입력 시간 간격을 더합니다. |
TIMESTAMPTZ(p) | 해당 시점을 현재 세션 시간대로 변환한 뒤 시간대 정보를 제거합니다. |
TIMESTAMP_NS | 값을 그대로 반환합니다. |
VARIANT | 호환되는 스칼라 값을 추출하고 해당 문자열, 숫자 또는 날짜·시간 변환 규칙을 적용합니다. |
NULL | NULL을 반환합니다. |
BOOLEAN, JSON, IP, 바이너리 및 복합 타입을 포함하여 지원되지 않는 타입에서 변환하면 분석 단계에서 실패합니다. 이는 값 변환 오류가 아닌 타입 오류이므로 비엄격 CAST와 TRY_CAST도 이를 NULL로 바꾸지 않습니다.
문자열에서 변환
엄격 모드
enable_strict_cast = true일 때 지원되는 형식과 파싱 규칙은 엄격 모드의 DATETIME 문자열 변환과 정확히 같습니다. 여기에는 날짜 및 시간 필드, 두 자리 연도, 생략된 시간 필드, 연속된 숫자, 공백 및 시간대 접미사에 대한 규칙이 포함됩니다.
비엄격 모드
enable_strict_cast = false일 때 지원되는 형식과 파싱 규칙은 비엄격 모드의 DATETIME 문자열 변환과 정확히 같습니다. 엄격 모드의 모든 형식은 그대로 유효하며, 비엄격 DATETIME에서 허용하는 추가 구분 기호, 구획 문자 및 앞뒤 공백도 TIMESTAMP_NS에서 허용합니다.
TIMESTAMP_NS로 변환할 때 두 모드의 차이는 DATETIME과 같습니다. 형식 오류나 값 범위 오류가 발생하면 엄격 모드에서는 오류를 발생시키고 비엄격 모드에서는 NULL을 반환합니다.
소수 초
해당하는 DATETIME 문자열 형식과의 유일한 차이는 지원되는 소수 초 정밀도입니다.
- 대상 스케일은 항상 9입니다. 소수부가 아홉 자리보다 짧으면 오른쪽을 영으로 채웁니다.
- 소수부가 아홉 자리를 초과하면 반올림합니다. 열 번째 자릿수에 따라 아홉 번째 자릿수를 올릴지 결정하며, 이후 자릿수는 결과에 영향을 주지 않습니다.
- 반올림으로 발생한 올림은 초, 날짜 또는 연도에 정상적으로 반영됩니다.
- Doris는 소수부 반올림과 시간대 변환을 수행한 후
TIMESTAMP_NS범위를 검증합니다.
시간대 처리
TIMESTAMP_NS는 시간대를 저장하지 않습니다.
- 시간대 접미사가 없으면 파싱된 달력상의 날짜와 시간을 그대로 저장합니다.
- 숫자 오프셋, UTC 지정자 또는 IANA 시간대 이름이 있으면 Doris는 입력 시점을 현재 세션 시간대로 변환하고, 변환된 날짜와 시간을 시간대 정보 없이 저장합니다.
- 값을 저장한 후 세션 시간대를 변경해도 저장된 값은 바뀌지 않습니다.
허용되는 시간대 접미사와 이름은 DATETIME 문자열 변환 규칙 및 시간대를 참조하세요.
다음 예제에서는 time_zone = '+08:00'으로 가정합니다.
| 문자열 | 모드 | 결과 | 설명 |
|---|---|---|---|
2024-02-29 12:34:56.123456 | 두 모드 모두 | 2024-02-29 12:34:56.123456000 | 소수부를 아홉 자리로 채웁니다. |
2024-02-29 12:34:56.1234567894 | 두 모드 모두 | 2024-02-29 12:34:56.123456789 | 열 번째 자릿수가 5보다 작으므로 소수부를 올리지 않습니다. |
2024-02-29 12:34:56.1234567895 | 두 모드 모두 | 2024-02-29 12:34:56.123456790 | 열 번째 자릿수가 5이므로 소수부를 올립니다. |
2024-02-29 12:34:56.9999999995 | 두 모드 모두 | 2024-02-29 12:34:57.000000000 | 반올림으로 발생한 올림이 다음 초로 이어집니다. |
2024-02-29T04:34:56.123456789Z | 두 모드 모두 | 2024-02-29 12:34:56.123456789 | UTC를 세션 시간대로 변환하고 시간대 정보를 제거합니다. |
2023-7-4T9-5-3.1Z | 비엄격 모드만 | 2023-07-04 17:05:03.100000000 | 비엄격 모드의 구분 기호와 앞뒤 공백을 사용합니다. |
2024-02-30 12:34:56 | 두 모드 모두 | 유효하지 않음 | 이월 30일은 그레고리력에 존재하지 않는 날짜입니다. |
2024-01-01 00:00:00.123.456 | 두 모드 모두 | 유효하지 않음 | 소수 초 구문이 유효하지 않습니다. |
경계에서의 반올림
반올림은 최종 범위 검사 전에 수행됩니다. 따라서 경계를 조금 벗어난 입력이 반올림 후 유효해질 수 있으며, 상한에 있는 입력은 반올림으로 값이 올라가면 유효하지 않게 될 수 있습니다.
| 문자열 | 결과 |
|---|---|
1677-09-21 00:12:43.1452241914 | 유효하지 않음: 반올림 후 하한보다 작음 |
1677-09-21 00:12:43.1452241915 | 1677-09-21 00:12:43.145224192 |
2262-04-11 23:47:16.8547758074 | 2262-04-11 23:47:16.854775807 |
2262-04-11 23:47:16.8547758075 | 유효하지 않음: 반올림 후 상한보다 큼 |
숫자에서 변환
모든 정수, 부동소수점 및 십진수 타입은 TIMESTAMP_NS로 변환할 수 있습니다. BOOLEAN은 지원하지 않습니다.
정수부의 필드 매핑, 두 자리 연도 규칙 및 유효한 축약 표현은 숫자에서 DATETIME으로의 변환과 같습니다. 특히 유효한 표현의 정수부는 3, 4, 5, 6, 8 또는 14자리입니다. 소수부는 소수 초를 나타냅니다.
축약 날짜·시간과 소수부로 생성되는 값은 TIMESTAMP_NS 범위 내에 있어야 합니다. 소수 초는 문자열 입력과 동일한 반올림 규칙을 사용하여 정확히 아홉 자리로 채우거나 반올림합니다.
정수 타입에서 변환
정수 타입에는 소수부가 없습니다. Doris는 축약 숫자 필드 매핑을 적용하고 결과에 .000000000을 덧붙입니다.
| 정수 값 | 결과 | 설명 |
|---|---|---|
123 | 2000-01-23 00:00:00.000000000 | 세 자리 축약 날짜입니다. |
20240229 | 2024-02-29 00:00:00.000000000 | 여덟 자리 축약 날짜입니다. |
20240229123456 | 2024-02-29 12:34:56.000000000 | 열네 자리 축약 날짜·시간입니다. |
16770921001243 | 유효하지 않음 | 변환된 시간이 하한보다 작습니다. |
22620412000000 | 유효하지 않음 | 변환된 시간이 상한보다 큽니다. |
FLOAT에서 변환
FLOAT는 변환 전 단정밀도 입력이 표현하는 십진수 값을 사용합니다. 유효 자릿수가 제한되어 있어 일반적으로 14자리 축약 날짜·시간을 표현하기에 부족하므로, 큰 입력은 자릿수가 손실되어 유효하지 않은 날짜·시간이 될 수 있습니다. 큰 축약 값에는 DOUBLE 또는 DECIMAL을 사용하세요.
| FLOAT 입력 표현식 | 엄격 모드 결과 | 비엄격 모드 결과 | 설명 |
|---|---|---|---|
CAST(123 AS FLOAT) | 2000-01-23 00:00:00.000000000 | 2000-01-23 00:00:00.000000000 | 값이 정확히 표현됩니다. |
CAST(20240229123456.125 AS FLOAT) | 오류 | NULL | 유효 자릿수가 손실되어 표현된 축약 날짜·시간이 유효하지 않습니다. |
DOUBLE에서 변환
DOUBLE은 변환 전 배정밀도 입력이 표현하는 십진수 값을 사용합니다. 모든 축약 TIMESTAMP_NS 값의 14자리 정수부를 정확히 표현할 수 있지만, 이진수로 정확히 표현할 수 없는 소수부는 변환 전에 반올림될 수 있습니다. 입력 소수부의 모든 자릿수를 보존해야 할 때는 DECIMAL을 사용하세요.
| DOUBLE 입력 표현식 | 결과 | 설명 |
|---|---|---|
CAST(20240229123456.125 AS DOUBLE) | 2024-02-29 12:34:56.125000000 | 정수부와 소수부를 모두 정확히 표현할 수 있습니다. |
DECIMAL에서 변환
DECIMAL은 리터럴의 십진수 표현을 유지합니다. 나노초 정밀도를 초과하는 자릿수는 반올림하여 소수부를 아홉 자리로 맞춥니다.
| DECIMAL 입력 표현식 | 결과 | 설명 |
|---|---|---|
CAST(20240229123456.1234567895 AS DECIMAL(24, 10)) | 2024-02-29 12:34:56.123456790 | 소수부를 나노초 단위로 반올림합니다. |
오류 처리
엄격 모드와 비엄격 모드는 동일한 숫자 매핑을 사용합니다. 표현된 숫자 값으로 유효 범위 내의 TIMESTAMP_NS를 생성할 수 없으면 엄격 모드는 오류를 보고하고 비엄격 모드는 NULL을 반환합니다. NULL 입력은 두 모드 모두에서 NULL을 반환합니다.
날짜·시간 타입에서 변환
DATE에서 변환
Doris는 입력 날짜에 00:00:00.000000000을 덧붙인 다음 TIMESTAMP_NS 범위를 확인합니다. 하한 날짜의 자정은 범위를 벗어나므로 1677-09-21은 변환할 수 없습니다. 변환 가능한 가장 이른 DATE는 1677-09-22입니다. 변환 가능한 가장 늦은 DATE는 2262-04-11입니다.
입력 DATE | 결과 |
|---|---|
1677-09-21 | 유효하지 않음 |
1677-09-22 | 1677-09-22 00:00:00.000000000 |
2262-04-11 | 2262-04-11 00:00:00.000000000 |
2262-04-12 | 유효하지 않음 |
DATETIME에서 변환
DATETIME과 TIMESTAMP_NS는 모두 시간대 정보가 없으므로 Doris는 시간대 조정 없이 달력상의 날짜와 시간을 유지합니다. DATETIME(p)의 소수부는 오른쪽에 영을 채워 아홉 자리로 맞추며, 원본 값에 없는 정밀도 정보를 만들어 내지 않습니다.
영을 채운 결과는 TIMESTAMP_NS 범위 내에 있어야 합니다. DATETIME은 최대 마이크로초 정밀도를 지원하므로, 하한에서 변환 가능한 가장 이른 값은 1677-09-21 00:12:43.145225이고 상한에서 변환 가능한 가장 늦은 값은 2262-04-11 23:47:16.854775입니다.
입력 DATETIME(6) | 결과 |
|---|---|
1677-09-21 00:12:43.145224 | 유효하지 않음 |
1677-09-21 00:12:43.145225 | 1677-09-21 00:12:43.145225000 |
2024-02-29 12:34:56.123456 | 2024-02-29 12:34:56.123456000 |
2262-04-11 23:47:16.854775 | 2262-04-11 23:47:16.854775000 |
2262-04-11 23:47:16.854776 | 유효하지 않음 |
TIME에서 변환
Doris는 세션 시간대에서 현재 날짜의 자정을 기준으로 부호가 있는 TIME 시간 간격을 더합니다. 시간 간격은 날짜 경계를 넘어갈 수 있습니다. 소수부의 정밀도는 최대 마이크로초이며, 영을 채워 아홉 자리로 맞춥니다. 그런 다음 Doris는 최종 날짜와 시간이 TIMESTAMP_NS 범위 내에 있는지 확인합니다.
예를 들어 현재 날짜가 2025-04-29라면 다음과 같습니다.
입력 TIME(6) | 결과 |
|---|---|
12:34:56.123456 | 2025-04-29 12:34:56.123456000 |
500:00:00.000000 | 2025-05-19 20:00:00.000000000 |
-128:00:00.000000 | 2025-04-23 16:00:00.000000000 |
이 변환은 현재 날짜에 따라 달라지므로 재현 가능한 날짜가 필요하면 명시적인 DATE 또는 DATETIME을 사용하세요.
TIMESTAMPTZ에서 변환
Doris는 값이 나타내는 시점을 현재 세션 시간대로 변환하고 시간대 정보를 제거한 다음, 원본 소수부에 영을 채워 아홉 자리로 맞춥니다. 최종 현지 날짜와 시간은 TIMESTAMP_NS 범위 내에 있어야 합니다.
따라서 time_zone을 변경하면 변환 결과가 달라질 수 있으며, 경계값이 지원 범위 안으로 들어오거나 범위를 벗어날 수 있습니다.
SET time_zone = '+08:00';
SELECT CAST(CAST('2024-02-29 04:34:56.123456+00:00' AS TIMESTAMPTZ(6)) AS TIMESTAMP_NS) AS ts;
+-------------------------------+
| ts |
+-------------------------------+
| 2024-02-29 12:34:56.123456000 |
+-------------------------------+
TIMESTAMP_NS 및 VARIANT에서 변환
TIMESTAMP_NS 값을 동일한 타입으로 변환하면 값이 정확히 유지됩니다. VARIANT에 저장된 호환 가능한 문자열, 숫자, 날짜 또는 타임스탬프 값은 위의 해당 규칙을 따릅니다. 시간대가 있는 타임스탬프 값은 현재 세션 시간대로 변환하며, 시간대 정보가 없는 타임스탬프 값은 달력상의 필드를 유지합니다. 호환되지 않는 VARIANT 내용은 변환 모드에 따라 NULL을 반환하거나 오류를 보고합니다.
관련 변환
TIMESTAMP_NS를 DATETIME(p) 또는 TIMESTAMPTZ(p)로 변환하면 소수부를 대상 정밀도로 반올림합니다. 예를 들어 2024-02-29 12:34:56.123456789를 정밀도 6으로 변환하면 2024-02-29 12:34:56.123457이 됩니다.
TIMESTAMP_NS와 DATETIME 값을 비교, 조인, CASE, COALESCE 또는 집합 연산에서 함께 사용하면, Doris는 값을 정확히 보존할 수 있을 때 TIMESTAMP_NS를 공통 타입으로 사용합니다.
오류 처리
| 상황 | enable_strict_cast = true | enable_strict_cast = false | TRY_CAST |
|---|---|---|---|
| 잘못된 형식 또는 달력상 유효하지 않은 값 | 오류 | NULL | NULL |
TIMESTAMP_NS 범위를 벗어난 값 | 오류 | NULL | NULL |
원본 값이 NULL임 | NULL | NULL | NULL |
| 지원하지 않는 원본 및 대상 타입 조합 | 분석 오류 | 분석 오류 | 분석 오류 |
문자열 입력의 경우 enable_strict_cast는 해당하는 엄격 또는 비엄격 DATETIME 파싱 규칙을 선택하고 변환 실패 처리 방식을 제어합니다. 숫자 입력의 경우 오류 처리 방식만 변경하며, 숫자 매핑은 두 모드에서 동일합니다.
예제
문자열을 나노초 정밀도로 변환하고 반올림 결과를 확인합니다.
SELECT
CAST('2024-02-29 12:34:56.123456' AS TIMESTAMP_NS) AS padded,
CAST('2024-02-29 12:34:56.1234567895' AS TIMESTAMP_NS) AS rounded;
+-------------------------------+-------------------------------+
| padded | rounded |
+-------------------------------+-------------------------------+
| 2024-02-29 12:34:56.123456000 | 2024-02-29 12:34:56.123456790 |
+-------------------------------+-------------------------------+
날짜·시간의 숫자 표현을 변환합니다.
SELECT CAST(CAST(20240229123456.1234567895 AS DECIMAL(24, 10)) AS TIMESTAMP_NS) AS ts;
+-------------------------------+
| ts |
+-------------------------------+
| 2024-02-29 12:34:56.123456790 |
+-------------------------------+
비엄격 모드에서는 유효하지 않은 값과 범위를 벗어난 값이 NULL을 반환합니다.
SET enable_strict_cast = false;
SELECT
CAST('2024-02-30 00:00:00' AS TIMESTAMP_NS) AS invalid_date,
CAST('2262-04-11 23:47:16.8547758075' AS TIMESTAMP_NS) AS overflow;
+--------------+----------+
| invalid_date | overflow |
+--------------+----------+
| NULL | NULL |
+--------------+----------+