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>
-
日付とタイムゾーンの間には任意の空白文字を使用できます。
-
大文字と小文字は区別しません。
-
次の三種類を使用できます。
-
数値オフセット:
(+|-)HH[:MM]や(+|-)HHMMなど。-
<hour-offset>: 0~14。一桁の場合、先頭の 0 は省略できます。 -
<minute-offset>: 00、30、45 のいずれか。":" は省略できます。 -
数値オフセットの最大範囲は
[-14:00, +14:00]です。
-
-
特別な UTC 識別子:
Z/UTC/GMT/CST/ZULU。各識別子が表すタイムゾーンオフセットは次のとおりです。-
Z: +00:00 -
UTC: +00:00 -
GMT: +00:00 -
CST: +08:00 -
ZULU: +00:00
-
-
長い形式のタイムゾーン名: 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:00 | 2023-07-16 19:20:30.123000 | 区切り文字付きの日付 + "T" + 秒とミリ秒 + 数値オフセット。UTC+8 に変換しても結果は変わりません。 |
2023-07-16T19+08:00 | 2023-07-16 19:00:00.000000 | 連結形式の時刻。分と秒は省略されています。UTC+8 に変換しても結果は変わりません。 |
2023-07-16T1920+08:00 | 2023-07-16 19:20:00.000000 | 連結形式の時刻。秒は省略されています。UTC+8 に変換しても結果は変わりません。 |
70-1-1T00:00:00-0000 | 1970-01-01 08:00:00.000000 | 二桁の年 + 一~二桁の月と日 + 区切り文字 + 連結形式のオフセット。UTC+8 に変換すると 8 時間加算されます。 |
19991231T235959.5UTC | 2000-01-01 07:59:59.500000 | 連結形式の日付 + "T" + 連結形式の時・分・秒 + 小数部 + UTC。UTC+8 に変換すると 8 時間加算されます。 |
2024-05-01T00:00Asia/Shanghai | 2024-05-01 00:00:00.000000 | 不完全な時刻 + タイムゾーン名。UTC+8 に変換しても結果は変わりません。 |
20231005T081530Europe/London | 2023-10-05 15:15:30.000000 | 連結形式の日付 + タイムゾーン名。夏時間中は GMT+1 のため、UTC+8 への変換で 7 時間加算されます。 |
20230105T081530 Europe/London | 2023-10-05 16:15:30.000000 | 連結形式の日付 + タイムゾーン名。夏時間以外は GMT+0 のため、UTC+8 への変換で 8 時間加算されます。 |
85-12-25T000000gMt | 1985-12-25 08:00:00.000000 | 大文字と小文字が混在したタイムゾーン。UTC+8 に変換すると 8 時間加算されます。 |
2024-05-01 | 2024-05-01 00:00:00.000000 | 日付のみ。 |
24-5-1 | 2024-05-01 00:00:00.000000 | 二桁の年 + 一桁の月と日。 |
2024-05-01 0:1:2.333 | 2024-05-01 00:01:02.333000 | 区切り文字付きの日付 + "T" + 一桁の時・分・秒 + ミリ秒。 |
2024-05-01 0:1:2. | 2024-05-01 00:01:02.000000 | 区切り文字付きの日付 + "T" + 一桁の時・分・秒 + 小数点のみ。 |
20240501 01 | 2024-05-01 01:00:00.000000 | 連結形式の日付 + "T" + 一桁の時。分と秒は省略されています。 |
20230716 1920Z | 2023-07-16 19:20:20.000000 | 連結形式の日付 + スペース + 連結形式の時と分 + UTC の "Z"。 |
2024-05-01T0000 | 2024-05-01 00:00:00.000000 | 区切り文字付きの日付 + "T" + 連結形式の時と分。秒は省略されています。 |
2024-12-31 23:59:59.9999999 | 2025-01-01 00:00:00.000000 | 年まで桁上がりします。 |
2025/06/15T00:00:00.99999999999999 | 2025-06-15 00:00:01.000000 | 小数点以下には任意の桁数を指定でき、通常どおり桁上がりします。 |
2025/06/15T00:00:00.9999987 | 2025-06-15 00:00:00.999999 | マイクロ秒の位で桁上がりします。 |
2025/06/15T00:00:00.99999849 | 2025-06-15 00:00:00.999998 | 丸めは隣接する桁だけを考慮し、マイクロ秒の位では桁上がりしません。 |
2020-12-12 13:12:12-03:00 | 2020-12-13 00:12:12.000000 | 桁上がりしません。 |
0023-01-01T00:00Z | 0023-01-01 08:00:00.000000 | 四桁の年は有効です。 |
69-12-31 | 2069-12-31 00:00:00.000000 | 二桁の年 69 → 2069-12-31。 |
70-01-01 | 1970-01-01 00:00:00.000000 | 二桁の年 70 → 1970-01-01。 |
230102 | 2023-01-02 00:00:00.000000 | 短い年を使う DATE の連結形式。 |
19230101 | 1923-01-01 00:00:00.000000 | 長い年を使う DATE の連結形式。 |
120102030405 | Error (format error) | DATE と TIME の区切り文字がありません。 |
20120102030405.123 +08 | 2012-01-02 03:05:05.123000 | 14 桁の連結形式の日付 + 小数部 + 短いタイムゾーンオフセット。 |
120102030405.999 | Error (format error) | DATE と TIME の区切り文字がありません。 |
2023-07-16T19.123+08:00 | Error (format error) | 日付のフィールドが連続していません(時とミリ秒の間の分と秒が省略されています)。 |
2024/05/01 | 2024-05-01 | 日付の区切り文字に '/' を使用しています。 |
24012 | Error (format error) | 日付の桁数が無効です。 |
2411 123 | Error (format error) | 日付部分と時刻部分の両方で桁数が無効です。 |
2024-05-01 01:030:02 | Error (format error) | 分の桁数が無効です。 |
10000-01-01 00:00:00 | Error (format error) | 年の桁数が無効です。 |
2024-0131T12:00 | Error (format error) | 月の連結形式で区切り文字を混在させています。 |
2024-05-01@00:00 | Error (format error) | 区切り文字が無効です。 |
20120212051 | Error (format error) | 桁数が正しくありません。 |
2024-05-01T00:00XYZ | Generally: Error (format error) | 未知のタイムゾーン略称です(タイムゾーンのドキュメントを参照)。 |
2024-5-1T24:00 | Error (domain error) | 時の値 24 は範囲外です。 |
2024-02-30 | Error (domain error) | 二月の 30 日は存在しません。 |
2024-05-01T12:60 | Error (domain error) | 分の値 60 は範囲外です。 |
2012-06-30T23:59:60 | Error (domain error) | うるう秒は使用できません。 |
2024-05-01T00:00+14:30 | Error (domain error) | タイムゾーンオフセットが最大範囲を超えています。 |
2024-05-01T00:00+08:25 | Error (domain error) | タイムゾーンオフセットの分の値 25 は無効です。 |
9999-12-31 23:59:59.9999999 | Error (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>(厳格モードと同じ)
-
日付とタイムゾーンの間には任意の空白文字を使用できます。
-
大文字と小文字は区別しません。
-
次の三種類を使用できます。
-
数値オフセット:
(+|-)HH[:MM]または(+|-)HHMM。-
<hour-offset>: 0~14。一桁の場合、先頭の 0 は省略できます。 -
<minute-offset>: 00、30、45 のいずれか。コロン ":" は省略できます。 -
数値オフセットの最大範囲は
[-14:00, +14:00]です。
-
-
特別な UTC 識別子:
Z/UTC/GMT/CST/ZULU。各識別子が表すタイムゾーンオフセットは次のとおりです。-
Z: +00:00 -
UTC: +00:00 -
GMT: +00:00 -
CST: +08:00 -
ZULU: +00:00
-
-
長い形式のタイムゾーン名: 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:30 | 2000-01-01 02:29:59.000000 | 日付と時刻の各フィールドは . で区切られています。タイムゾーンは +05:30(分の値 30 は有効)です。"T" はありません。 |
2000/01/01T00/00/00-230 | 2000-01-01 10:30:00.000000 | 区切り文字は / です。タイムゾーン -230 にはコロンがなく、時は 1 桁です。 |
85 1 1T0 0 0. cst | 1985-01-01 00:00:00.000000 | すべてのフィールドがスペースで区切られています。二桁の年は 1985 に対応します。小数点以下の数字はありません。短いタイムゾーン名では大文字と小文字を区別しません。 |
2024-02-29T23:59:59.999999 UTC | 2024-03-01 07:59:59.999999 | うるう年は有効です。高精度の小数部で桁上がりはありません。特定のタイムゾーン名を使用しています。 |
70-01-01T00:00:00+14 | 1969-12-31 18:00:00.000000 | 二桁の年は 1970 に対応します。+14 は有効な最大オフセットで、分の部分はありません。 |
0023-1-1T1:2:3. -00:00 | 0023-01-01 09:07:46.000000 | 四桁の年は 0023 です。時刻フィールドには一桁と二桁が混在します。小数点以下の数字はありません。分のオフセットに符号はありません。 |
2025/06/15T00:00:00.0-0 | 2025-06-15 08:00:00.000000 | 区切り文字は / です。小数点以下は 1 桁です。オフセット -0 は -00:00 と等価です。 |
2025/06/15T00:00:00.99999999999 | 2025-06-15 00:00:01.000000 | 小数点以下の桁数は任意で、6 桁への丸めによって桁上がりします。 |
2024-02-29T23-59-60ZULU | NULL (format error) | 秒の値が範囲外です。 |
2024 12 31T121212.123456 America/New_York | NULL (format error) | 区切り文字のない数値だけの時刻です。 |
123.123 | NULL (format error) | 動作の変更: 以前は 2012-03-12 03:00:00.000000 を表していましたが、現在はサポートされません。 |
12121 | NULL (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.123 | 2000-01-23 00:00:00.123000 | 3 桁の数値 + 小数部。 |
20150102030405 | 2015-01-02 03:04:05.000000 | 14 桁の数値。 |
20150102030405.123456 | 2015-01-02 03:04:05.123456 | 14 桁の数値 + 小数部。 |
20151231235959.99999999999 | 2016-01-01 00:00:00.000000 | 14 桁の数値。小数部は有効で、年まで桁上がりします。 |
1000 | Error | 2000-10-00 の日が無効です。 |
-123.123 | Error | 負の時刻からは有効な日付を生成できません。 |
非厳格モード
エラー処理を除き、非厳格モードの動作は厳格モードと完全に同じです。
ルールの説明
有効な形式
整数部では、日付の右端から左へ、下位桁から上位桁の順に数値を埋めます。有効な形式とそれぞれの結果を以下に示します(マイクロ秒部分は除きます)。
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.123 | 2000-01-23 00:00:00.123000 | 3 桁の数値 + 小数部。 |
20150102030405 | 2015-01-02 03:04:05.000000 | 14 桁の数値。 |
20150102030405.123456 | 2015-01-02 03:04:05.123456 | 14 桁の数値 + 小数部。 |
20151231235959.99999999999 | 2016-01-01 00:00:00.000000 | 14 桁の数値。小数部は有効で、年まで桁上がりします。 |
1000 | NULL | 2000-10-00 の日が無効です。 |
-123.123 | NULL | 負の時刻からは有効な日付を生成できません。 |
日付・時刻型からの変換
Date、Time、Timestamptz 型は Datetime 型に変換できます。また、Datetime 型には異なる精度があるため、精度の異なる Datetime 型間でも変換できます。
Timestamptz から Datetime への変換は、現在のセッションのタイムゾーンに基づいて行われます。
Date 型
ルールの説明
Date から変換すると、入力の日付部分に全桁が 0 の時刻部分を追加した結果になります。この変換は常に有効です。
例
| 入力 DATE | 変換先の型 | Datetime への変換結果 |
|---|---|---|
| 2012-02-05 | Datetime(0) | 2012-02-05 00:00:00 |
| 2012-02-05 | Datetime(6) | 2012-02-05 00:00:00.000000 |
Time 型
ルールの説明
Time から変換すると、現在の日付の 00:00:00 に入力の Time を加えた結果になります。この変換は、想定できる将来(9999 年の十二月より前)では有効なため、Doris は常に有効な変換とみなします。
例
現在の日付を 2025-04-29 とすると、結果は次のとおりです。
| 入力 TIME | DATETIME(0) への変換結果 |
|---|---|
500:00:00 | 2025-05-19 20:00:00 |
23:59:59 | 2025-04-29 23:59:59 |
Datetime 型
厳格モード
ルールの説明
低い精度から高い精度へ変換する場合、新たに追加される小数部の桁を 0 で埋めます。この変換は常に有効です。
高い精度から低い精度へ変換する場合、桁上がりが発生し、さらに上位桁へ伝播することがあります。オーバーフローすると、変換後の値は無効です。
エラー処理
オーバーフローが発生すると、エラーが報告されます。
例
現在の日付を 2025-04-29 とすると、結果は次のとおりです。
| 入力 DATETIME | 変換元の型 | 変換先の型 | 結果 DATETIME | 備考 |
|---|---|---|---|---|
2020-12-12 00:00:00.123 | Datetime(3) | Datetime(6) | 2020-12-12 00:00:00.123000 | 精度を上げます。 |
2020-12-12 00:00:00.123456 | Datetime(6) | Datetime(3) | 2020-12-12 00:00:00.123 | 精度を下げます。桁上がりはありません。 |
2020-12-12 00:00:00.99666 | Datetime(6) | Datetime(2) | 2020-12-12 00:00:01.00 | 精度を下げ、秒の位まで桁上がりします。 |
9999-12-31 23:59:59.999999 | Datetime(6) | Datetime(5) | Error | 桁上がりでオーバーフローし、10000 年という無効な日付になります。 |
非厳格モード
エラー処理を除き、非厳格モードの動作は厳格モードと完全に同じです。
ルールの説明
低い精度から高い精度へ変換する場合、新たに追加される小数部の桁を 0 で埋めます。この変換は常に有効です。
高い精度から低い精度へ変換する場合、桁上がりが発生し、さらに上位桁へ伝播することがあります。オーバーフローすると、変換後の値は無効です。
エラー処理
オーバーフローが発生すると、NULL を返します。
例
現在の日付を 2025-04-29 とすると、結果は次のとおりです。
| 入力 DATETIME | 変換元の型 | 変換先の型 | 結果 DATETIME | 備考 |
|---|---|---|---|---|
2020-12-12 00:00:00.123 | Datetime(3) | Datetime(6) | 2020-12-12 00:00:00.123000 | 精度を上げます。 |
2020-12-12 00:00:00.123456 | Datetime(6) | Datetime(3) | 2020-12-12 00:00:00.123 | 精度を下げます。桁上がりはありません。 |
2020-12-12 00:00:00.99666 | Datetime(6) | Datetime(2) | 2020-12-12 00:00:01.00 | 精度を下げ、秒の位まで桁上がりします。 |
9999-12-31 23:59:59.999999 | Datetime(6) | Datetime(5) | NULL | 桁上がりでオーバーフローし、10000 年という無効な日付になります。 |
Timestamptz 型
厳格モード
ルールの説明
低い精度から高い精度へ変換する場合、新たに追加される小数部の桁を 0 で埋めます。この変換は常に有効です。
高い精度から低い精度へ変換する場合、桁上がりが発生し、さらに上位桁へ伝播することがあります。オーバーフローすると、変換後の値は無効です。
エラー処理
オーバーフローが発生すると、エラーが報告されます。
例
| 入力 TIMESTAMPTZ | 変換元の型 | 変換先の型 | 結果 DATETIME | 備考 |
|---|---|---|---|---|
2020-12-12 00:00:00.123+08:00 | Timestamptz(3) | Datetime(6) | 2020-12-12 00:00:00.123000 | 精度を上げます。 |
2020-12-12 00:00:00.123456+08:00 | Timestamptz(6) | Datetime(3) | 2020-12-12 00:00:00.123 | 精度を下げます。桁上がりはありません。 |
2020-12-12 00:00:00.99666+08:00 | Timestamptz(6) | Datetime(2) | 2020-12-12 00:00:01.00 | 精度を下げ、秒の位まで桁上がりします。 |
9999-12-31 23:59:59.999999+08:00 | Timestamptz(6) | Datetime(5) | Error | 桁上がりでオーバーフローし、10000 年という無効な日付になります。 |
非厳格モード
エラー処理を除き、非厳格モードの動作は厳格モードと完全に同じです。
ルールの説明
低い精度から高い精度へ変換する場合、新たに追加される小数部の桁を 0 で埋めます。この変換は常に有効です。
高い精度から低い精度へ変換する場合、桁上がりが発生し、さらに上位桁へ伝播することがあります。オーバーフローすると、変換後の値は無効です。
エラー処理
オーバーフローが発生すると、NULL を返します。
例
| 入力 TIMESTAMPTZ | 変換元の型 | 変換先の型 | 結果 DATETIME | 備考 |
|---|---|---|---|---|
2020-12-12 00:00:00.123+08:00 | Timestamptz(3) | Datetime(6) | 2020-12-12 00:00:00.123000 | 精度を上げます。 |
2020-12-12 00:00:00.123456+08:00 | Timestamptz(6) | Datetime(3) | 2020-12-12 00:00:00.123 | 精度を下げます。桁上がりはありません。 |
2020-12-12 00:00:00.99666+08:00 | Timestamptz(6) | Datetime(2) | 2020-12-12 00:00:01.00 | 精度を下げ、秒の位まで桁上がりします。 |
9999-12-31 23:59:59.999999+08:00 | Timestamptz(6) | Datetime(5) | NULL | 桁上がりでオーバーフローし、10000 年という無効な日付になります。 |