メインコンテンツまでスキップ
に最終更新

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 の設定項目 allow_zero_date が true の場合、ドメインエラーにはならず、結果は 0000 年 01 月 01 日になります。

桁上がり​
  • <fraction> の小数点以下の桁数が <scale> を超える場合、<scale> 桁に丸められます。この処理で桁上がりが生じた場合は通常どおり伝播し、最終的に結果のどの部分にも影響する可能性があります。

  • 入力に <offset> 部分がある場合も、桁上がりが生じる可能性があります。<offset> は通常、時刻の値を変更します。時または分で桁上がりが生じた場合は通常どおり伝播し、最終的に結果の日付部分にも影響します。

  • <offset> と <fraction> による桁上がりは競合しないため、両方が同時に発生し、結果に複合的な影響を与えることがあります。

エラー処理​
  • 形式エラー: 入力が上記の BNF のどの分岐にも一致しない場合、直ちにエラーが報告されます。

  • ドメインエラー: いずれかの部分の値が無効で、結果が有効なグレゴリオ暦の日時にならない場合、エラーが報告されます。

例​

現在の Doris のタイムゾーンを UTC+8 (+08:00) とします。タイムゾーンが時刻型の解析に与える影響については、タイムゾーンのドキュメントを参照してください。以下の結果は、小数点以下 6 桁を保持できる 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 であり、UTC+8 への変換で 7 時間加算されます。
20230105T081530 Europe/London2023-10-05 16:15:30.000000連結形式の日付 + タイムゾーン名。夏時間外は GMT+0 であり、UTC+8 への変換で 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 連結形式。
120102030405Error (format error)DATE と TIME の区切り文字がありません。
20120102030405.123 +082012-01-02 03:05:05.12300014 桁の連結形式の日付 + 小数部分 + 短いタイムゾーンオフセット。
120102030405.999Error (format error)DATE と TIME の区切り文字がありません。
2023-07-16T19.123+08:00Error (format error)日付のフィールドが連続していません(時の後に分と秒を飛ばしてミリ秒を指定)。
2024/05/012024-05-01日付の区切り文字に '/' を使用しています。
24012Error (format error)日付の桁数が無効です。
2411 123Error (format error)日付部分と時刻部分の両方で桁数が無効です。
2024-05-01 01:030:02Error (format error)分の桁数が無効です。
10000-01-01 00:00:00Error (format error)年の桁数が無効です。
2024-0131T12:00Error (format error)月を連結する形式で区切り文字を混用しています。
2024-05-01@00:00Error (format error)区切り文字が無効です。
20120212051Error (format error)桁数が正しくありません。
2024-05-01T00:00XYZGenerally: Error (format error)不明なタイムゾーンの略称です(タイムゾーンのドキュメントを参照)。
2024-5-1T24:00Error (domain error)時の値 24 は範囲外です。
2024-02-30Error (domain error)二月 30 日は存在しません。
2024-05-01T12:60Error (domain error)分の値 60 は範囲外です。
2012-06-30T23:59:60Error (domain error)うるう秒は使用できません。
2024-05-01T00:00+14:30Error (domain error)タイムゾーンオフセットが最大範囲を超えています。
2024-05-01T00:00+08:25Error (domain error)タイムゾーンオフセットの分の値 25 は無効です。
9999-12-31 23:59:59.9999999Error (domain error)小数部の桁数を減らす際の桁上がりにより、結果が有効範囲の上限を超えます。

非厳格モード​

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 の設定項目 allow_zero_date が true の場合、ドメインエラーにはならず、結果は 0000-01-01 に設定されます。

桁上がり​
  • <fraction> の小数点以下の桁数が <scale> を超える場合、<scale> 桁に丸められます。この処理で桁上がりが生じた場合は通常どおり伝播し、結果のどの部分にも影響する可能性があります。

  • 入力に <offset> 部分がある場合も、桁上がりが生じる可能性があります。<offset> は通常、時刻の値を変更します。時または分で桁上がりが生じた場合は通常どおり伝播し、結果の日付部分にも影響します。

  • <offset> と <fraction> による桁上がりは競合しないため、両方が同時に発生し、結果に複合的な影響を与えることがあります。

エラー処理​
  • 形式エラー: 入力が上記の BNF のどの分岐にも一致しない場合、戻り値は NULL になります。

  • ドメインエラー: いずれかの部分の値が無効で、結果が有効なグレゴリオ暦の日時にならない場合、NULL が返されます。

例​

現在の Doris のタイムゾーンを UTC+8 (+08:00) とします。タイムゾーンが時刻型の解析に与える影響については、タイムゾーンのドキュメントを参照してください。以下の結果は、小数点以下 6 桁を保持できる 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区切り文字は / です。タイムゾーン -230 では、コロンを省略し、時を 1 桁で指定しています。
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 (format error)秒が範囲外です。
2024 12 31T121212.123456 America/New_YorkNULL (format error)区切り文字のない数字のみの時刻です。
123.123NULL (format error)動作の変更: 以前は 2012-03-12 03:00:00.000000 を表しましたが、現在はサポートされません。
12121NULL (format error)動作の変更: 以前は 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)の場合は、Cast の前にその型が実際に表す値を使用します。

桁上がり​

小数点以下の桁数が <scale> を超える場合、<scale> 桁に丸められます。この処理で桁上がりが生じた場合は通常どおり伝播し、結果のどの部分にも影響する可能性があります。

エラー処理​

ルールに従って入力を有効な DATETIME 値に解析できない場合、エラーが報告されます。

例​

以下の結果は、小数点以下 6 桁を保持できる 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 桁の数値で小数部分も有効。年への桁上がり。
1000Error2000-10-00 の日が無効です。
-123.123Error負の時刻から有効な日付は得られません。

非厳格モード​

エラー処理を除き、非厳格モードの動作は厳格モードと完全に同じです。

ルールの説明​

有効な形式​

整数部分では、日付の右端から左へ、下位の桁から上位の桁に向かって数字を割り当てます。次の形式と対応する割り当て結果が有効です(マイクロ秒部分を除く)。

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 が返されます。

例​

以下の結果は、小数点以下 6 桁を保持できる 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)Error桁上がりによるオーバーフローで、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)Error桁上がりによるオーバーフローで、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 年の無効な日付になります。

TIMESTAMP_NS​

TIMESTAMP_NS は DATETIME と同様にタイムゾーンを持たないため、変換時にはタイムゾーンの調整を行わず、暦上の日付と時刻を維持します。TIMESTAMP_NS の小数部は常に九桁で、DATETIME は最大六桁をサポートするため、小数部分は変換先の DATETIME の精度に丸められます。桁上がりが次の秒に伝播することがあります。

すべての有効な TIMESTAMP_NS 値は DATETIME の日付範囲内にあるため、厳格モードでも非厳格モードでも変換は常に成功します。入力が NULL の場合は NULL が返されます。

入力 TIMESTAMP_NS変換先の型結果の DATETIME説明
2024-02-29 12:34:56.123456499Datetime(6)2024-02-29 12:34:56.123456切り捨てられる桁を考慮すると、切り下げになります。
2024-02-29 12:34:56.123456500Datetime(6)2024-02-29 12:34:56.123457切り捨てられる桁を考慮すると、切り上げになります。
1969-12-31 23:59:59.999999500Datetime(6)1970-01-01 00:00:00.000000次の秒および日付に桁上がりします。
2024-02-29 12:34:56.123456789Datetime(3)2024-02-29 12:34:56.123ミリ秒精度に丸めます。