본문으로 건너뛰기
최종 수정: 에

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>​
  • 날짜와 시간대 사이에는 모든 공백 문자를 허용합니다.

  • 대소문자를 구분하지 않습니다.

  • 다음 세 가지 유형을 허용합니다.

    1. 숫자 오프셋: (+|-)HH[:MM] 또는 (+|-)HHMM 등.

      • <hour-offset>: 0–14이며, 한 자리 값에서는 앞의 0을 생략할 수 있습니다.

      • <minute-offset>: 00, 30 또는 45이며, ":"는 생략할 수 있습니다.

      • 숫자 오프셋의 최대 범위는 [-14:00, +14:00]입니다.

    2. 특수 UTC 식별자: Z/UTC/GMT/CST/ZULU. 각 기호가 나타내는 시간대 오프셋은 다음과 같습니다.

      • Z: +00:00

      • UTC: +00:00

      • GMT: +00:00

      • CST: +08:00

      • ZULU: +00:00

    3. 긴 형식의 시간대 이름: 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:002023-07-16 19:20:30.123000구분자가 있는 날짜 + "T" + 초 및 밀리초 + 숫자 오프셋. UTC+8로 변환해도 결과가 바뀌지 않습니다.
2023-07-16T19+08:002023-07-16 19:00:00.000000이어 붙인 시간 형식으로, 분과 초가 생략되었습니다. UTC+8로 변환해도 결과가 바뀌지 않습니다.
2023-07-16T1920+08:002023-07-16 19:20:00.000000이어 붙인 시간 형식으로, 초가 생략되었습니다. UTC+8로 변환해도 결과가 바뀌지 않습니다.
70-1-1T00:00:00-00001970-01-01 08:00:00.000000두 자리 연도 + 한 자리 또는 두 자리 월 및 일 + 구분자 + 이어 붙인 오프셋. UTC+8로 변환하면 8시간이 더해집니다.
19991231T235959.5UTC2000-01-01 07:59:59.500000이어 붙인 날짜 + "T" + 이어 붙인 시, 분, 초 + 소수 부분 + UTC. UTC+8로 변환하면 8시간이 더해집니다.
2024-05-01T00:00Asia/Shanghai2024-05-01 00:00:00.000000일부 필드가 생략된 시간 + 시간대 이름. UTC+8로 변환해도 결과가 바뀌지 않습니다.
20231005T081530Europe/London2023-10-05 15:15:30.000000이어 붙인 날짜 + 시간대 이름. 일광 절약 시간 적용 기간에는 GMT+1이며, 7시간을 더해 UTC+8로 변환합니다.
20230105T081530 Europe/London2023-10-05 16:15:30.000000이어 붙인 날짜 + 시간대 이름. 일광 절약 시간 미적용 기간에는 GMT+0이며, 8시간을 더해 UTC+8로 변환합니다.
85-12-25T000000gMt1985-12-25 08:00:00.000000대소문자가 혼합된 시간대. UTC+8로 변환하면 8시간이 더해집니다.
2024-05-012024-05-01 00:00:00.000000날짜만 있음
24-5-12024-05-01 00:00:00.000000두 자리 연도 + 한 자리 월 및 일
2024-05-01 0:1:2.3332024-05-01 00:01:02.333000구분자가 있는 날짜 + "T" + 한 자리 시, 분, 초 + 밀리초
2024-05-01 0:1:2.2024-05-01 00:01:02.000000구분자가 있는 날짜 + "T" + 한 자리 시, 분, 초 + 소수점만 있음
20240501 012024-05-01 01:00:00.000000이어 붙인 날짜 + "T" + 한 자리 시, 분과 초 생략
20230716 1920Z2023-07-16 19:20:20.000000이어 붙인 날짜 + 공백 + 이어 붙인 시 및 분 + UTC "Z"
2024-05-01T00002024-05-01 00:00:00.000000구분자가 있는 날짜 + "T" + 이어 붙인 시 및 분, 초 생략
2024-12-31 23:59:59.99999992025-01-01 00:00:00.000000연도까지 올림 발생
2025/06/15T00:00:00.999999999999992025-06-15 00:00:01.000000소수 자릿수 제한 없음, 정상적으로 올림 발생
2025/06/15T00:00:00.99999872025-06-15 00:00:00.999999마이크로초 자리로 올림 발생
2025/06/15T00:00:00.999998492025-06-15 00:00:00.999998반올림 시 바로 다음 자리만 고려하므로 마이크로초 자리로 올림이 발생하지 않습니다.
2020-12-12 13:12:12-03:002020-12-13 00:12:12.000000올림 없음
0023-01-01T00:00Z0023-01-01 08:00:00.000000네 자리 연도는 유효함
69-12-312069-12-31 00:00:00.000000두 자리 연도 69 → 2069-12-31
70-01-011970-01-01 00:00:00.000000두 자리 연도 70 → 1970-01-01
2301022023-01-02 00:00:00.000000짧은 연도를 사용하는 DATE 이어 붙인 형식
192301011923-01-01 00:00:00.000000긴 연도를 사용하는 DATE 이어 붙인 형식
120102030405오류(형식 오류)DATE - TIME 구분자 누락
20120102030405.123 +082012-01-02 03:05:05.12300014자리 이어 붙인 날짜 형식 + 소수 부분 + 짧은 시간대 오프셋
120102030405.999오류(형식 오류)DATE - TIME 구분자 누락
2023-07-16T19.123+08:00오류(형식 오류)날짜에 연속되지 않은 필드가 있음(시+밀리초로, 분과 초를 건너뜀)
2024/05/012024-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>(엄격 모드와 동일)​
  • 날짜와 시간대 사이에는 모든 공백 문자를 허용합니다.

  • 대소문자를 구분하지 않습니다.

  • 다음 세 가지 유형을 허용합니다.

    1. 숫자 오프셋: (+|-)HH[:MM] 또는 (+|-)HHMM

      • <hour-offset>: 0-14이며, 한 자리 값에서는 앞의 0을 생략할 수 있습니다.

      • <minute-offset>: 00, 30 또는 45이며, 콜론 ":"는 생략할 수 있습니다.

      • 숫자 오프셋의 최대 범위는 [-14:00, +14:00]입니다.

    2. 특수 UTC 식별자: Z/UTC/GMT/CST/ZULU. 각 기호가 나타내는 시간대 오프셋은 다음과 같습니다.

      • Z: +00:00

      • UTC: +00:00

      • GMT: +00:00

      • CST: +08:00

      • ZULU: +00:00

    3. 긴 시간대 이름: 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:302000-01-01 02:29:59.000000날짜 및 시간의 필드는 .로 구분합니다. 시간대는 +05:30(분 값 30은 유효함)이며, "T"가 없습니다.
2000/01/01T00/00/00-2302000-01-01 10:30:00.000000/ 구분자 사용. 콜론이 없고 시가 1자리인 시간대 -230
85 1 1T0 0 0. cst1985-01-01 00:00:00.000000모든 필드를 공백으로 구분합니다. 두 자리 연도는 1985에 매핑됩니다. 소수점 뒤에 숫자가 없으며, 짧은 시간대 이름은 대소문자를 구분하지 않습니다.
2024-02-29T23:59:59.999999 UTC2024-03-01 07:59:59.999999윤년은 유효함. 올림이 없는 높은 정밀도의 소수 부분. 특정 시간대 이름
70-01-01T00:00:00+141969-12-31 18:00:00.000000두 자리 연도 1970. 최대 유효 오프셋 +14. 분 부분 없음
0023-1-1T1:2:3. -00:000023-01-01 09:07:46.000000네 자리 연도 0023. 한 자리와 두 자리 시간 필드 혼용. 소수점 뒤에 숫자 없음. 분에 부호가 없는 오프셋
2025/06/15T00:00:00.0-02025-06-15 08:00:00.000000/ 구분자. 소수점 뒤 1자리. 오프셋 -0(-00:00과 동일)
2025/06/15T00:00:00.999999999992025-06-15 00:00:01.000000소수 자릿수 제한 없음. 소수 6자리로 처리할 때 올림 발생
2024-02-29T23-59-60ZULUNULL(형식 오류)초가 범위를 벗어남
2024 12 31T121212.123456 America/New_YorkNULL(형식 오류)구분자 없이 숫자로만 구성된 시간
123.123NULL(형식 오류)동작 변경: 이전에는 2012-03-12 03:00:00.000000을 나타냈으나, 이제는 지원하지 않습니다.
12121NULL(형식 오류)동작 변경: 이전에는 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.1232000-01-23 00:00:00.1230003자리 숫자 + 소수 부분
201501020304052015-01-02 03:04:05.00000014자리 숫자
20150102030405.1234562015-01-02 03:04:05.12345614자리 숫자 + 소수 부분
20151231235959.999999999992016-01-01 00:00:00.00000014자리 숫자, 소수 부분 유효, 연도까지 올림 발생
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.1232000-01-23 00:00:00.1230003자리 숫자 + 소수 부분
201501020304052015-01-02 03:04:05.00000014자리 숫자
20150102030405.1234562015-01-02 03:04:05.12345614자리 숫자 + 소수 부분
20151231235959.999999999992016-01-01 00:00:00.00000014자리 숫자, 소수 부분 유효, 연도까지 올림 발생
1000NULL2000-10-00의 일이 유효하지 않음
-123.123NULL음수 시간으로는 유효한 날짜를 생성할 수 없음

날짜 및 시간 계열 타입에서 변환​

Date, Time, Timestamptz 타입은 Datetime 타입으로 변환할 수 있습니다. Datetime에는 서로 다른 정밀도가 있으므로, 정밀도가 다른 Datetime 타입 간 변환도 가능합니다.

Timestamptz를 Datetime으로 변환할 때는 현재 세션의 시간대를 기준으로 변환합니다.

Date​

규칙 설명​

Date에서 변환하면 입력의 날짜 부분에 모든 값이 0인 시간 부분을 더한 결과가 됩니다. 이 변환은 항상 유효합니다.

예제​

입력 DATE대상 타입Datetime으로 변환한 결과
2012-02-05Datetime(0)2012-02-05 00:00:00
2012-02-05Datetime(6)2012-02-05 00:00:00.000000

Time​

규칙 설명​

Time에서 변환하면 현재 날짜의 00:00:00 시각에 입력 Time을 더한 결과가 됩니다. 이 변환은 예측 가능한 미래(9999년 십이월 이전)까지 유효하므로 Doris는 항상 유효한 것으로 간주합니다.

예제​

현재 날짜가 2025-04-29라고 가정하면 결과는 다음과 같습니다.

입력 TIMEDATETIME(0)으로 변환한 결과
500:00:002025-05-19 20:00:00
23:59:592025-04-29 23:59:59

Datetime​

엄격 모드​

규칙 설명​

낮은 정밀도에서 높은 정밀도로 변환할 때는 새로 생기는 소수 자리를 0으로 채우며, 이 변환은 항상 유효합니다.

높은 정밀도에서 낮은 정밀도로 변환할 때는 올림이 발생하며, 더 높은 자리로 계속 전파될 수 있습니다. 오버플로가 발생하면 변환된 값은 유효하지 않습니다.

오류 처리​

오버플로가 발생하면 오류를 보고합니다.

예제​

현재 날짜가 2025-04-29라고 가정하면 결과는 다음과 같습니다.

입력 DATETIME원본 타입대상 타입결과 DATETIME설명
2020-12-12 00:00:00.123Datetime(3)Datetime(6)2020-12-12 00:00:00.123000정밀도 증가
2020-12-12 00:00:00.123456Datetime(6)Datetime(3)2020-12-12 00:00:00.123정밀도 감소, 올림 없음
2020-12-12 00:00:00.99666Datetime(6)Datetime(2)2020-12-12 00:00:01.00정밀도 감소, 초 자리로 올림 발생
9999-12-31 23:59:59.999999Datetime(6)Datetime(5)오류올림으로 오버플로가 발생하여 유효하지 않은 10000년 날짜가 생성됨

비엄격 모드​

오류 처리를 제외하면 비엄격 모드의 동작은 엄격 모드와 완전히 같습니다.

규칙 설명​

낮은 정밀도에서 높은 정밀도로 변환할 때는 새로 생기는 소수 자리를 0으로 채우며, 이 변환은 항상 유효합니다.

높은 정밀도에서 낮은 정밀도로 변환할 때는 올림이 발생하며, 더 높은 자리로 계속 전파될 수 있습니다. 오버플로가 발생하면 변환된 값은 유효하지 않습니다.

오류 처리​

오버플로가 발생하면 NULL을 반환합니다.

예제​

현재 날짜가 2025-04-29라고 가정하면 결과는 다음과 같습니다.

입력 DATETIME원본 타입대상 타입결과 DATETIME설명
2020-12-12 00:00:00.123Datetime(3)Datetime(6)2020-12-12 00:00:00.123000정밀도 증가
2020-12-12 00:00:00.123456Datetime(6)Datetime(3)2020-12-12 00:00:00.123정밀도 감소, 올림 없음
2020-12-12 00:00:00.99666Datetime(6)Datetime(2)2020-12-12 00:00:01.00정밀도 감소, 초 자리로 올림 발생
9999-12-31 23:59:59.999999Datetime(6)Datetime(5)NULL올림으로 오버플로가 발생하여 유효하지 않은 10000년 날짜가 생성됨

Timestamptz​

엄격 모드​

규칙 설명​

낮은 정밀도에서 높은 정밀도로 변환할 때는 새로 생기는 소수 자리를 0으로 채우며, 이 변환은 항상 유효합니다.

높은 정밀도에서 낮은 정밀도로 변환할 때는 올림이 발생하며, 더 높은 자리로 계속 전파될 수 있습니다. 오버플로가 발생하면 변환된 값은 유효하지 않습니다.

오류 처리​

오버플로가 발생하면 오류를 보고합니다.

예제​
입력 TIMESTAMPTZ원본 타입대상 타입결과 DATETIME설명
2020-12-12 00:00:00.123+08:00Timestamptz(3)Datetime(6)2020-12-12 00:00:00.123000정밀도 증가
2020-12-12 00:00:00.123456+08:00Timestamptz(6)Datetime(3)2020-12-12 00:00:00.123정밀도 감소, 올림 없음
2020-12-12 00:00:00.99666+08:00Timestamptz(6)Datetime(2)2020-12-12 00:00:01.00정밀도 감소, 초 자리로 올림 발생
9999-12-31 23:59:59.999999+08:00Timestamptz(6)Datetime(5)오류올림으로 오버플로가 발생하여 유효하지 않은 10000년 날짜가 생성됨

비엄격 모드​

오류 처리를 제외하면 비엄격 모드의 동작은 엄격 모드와 완전히 같습니다.

규칙 설명​

낮은 정밀도에서 높은 정밀도로 변환할 때는 새로 생기는 소수 자리를 0으로 채우며, 이 변환은 항상 유효합니다.

높은 정밀도에서 낮은 정밀도로 변환할 때는 올림이 발생하며, 더 높은 자리로 계속 전파될 수 있습니다. 오버플로가 발생하면 변환된 값은 유효하지 않습니다.

오류 처리​

오버플로가 발생하면 NULL을 반환합니다.

예제​
입력 TIMESTAMPTZ원본 타입대상 타입결과 DATETIME설명
2020-12-12 00:00:00.123+08:00Timestamptz(3)Datetime(6)2020-12-12 00:00:00.123000정밀도 증가
2020-12-12 00:00:00.123456+08:00Timestamptz(6)Datetime(3)2020-12-12 00:00:00.123정밀도 감소, 올림 없음
2020-12-12 00:00:00.99666+08:00Timestamptz(6)Datetime(2)2020-12-12 00:00:01.00정밀도 감소, 초 자리로 올림 발생
9999-12-31 23:59:59.999999+08:00Timestamptz(6)Datetime(5)NULL올림으로 오버플로가 발생하여 유효하지 않은 10000년 날짜가 생성됨