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

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 年という無効な日付になります。