DATE 型への変換
DATE 型の有効範囲: [0000-01-01, 9999-12-31]
文字列からの変換
厳密モード
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"
ルールの説明
全体構造
-
日付部分は必須です。時刻部分とタイムゾーン部分は省略できます。
-
時刻部分がある場合、日付と時刻の区切りには大文字の "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 は <date> 部分だけを読み取り、その結果を変換後の値として使用します。入力は各フィールドに応じて結果の該当部分に割り当てられます。たとえば、一致した <year> は結果の年、<month> は月、<day> は日を設定します。
具体的には、入力の日付部分が 0000 年 00 月 00 日となり、BE 設定の allow_zero_date が true の場合、ドメインエラーとは見なされず、結果は 0000 年 01 月 01 日になります。
桁上がり
桁上がりは発生しません。
エラー処理
-
形式エラー: 入力が上記 BNF のどの分岐にも一致しない場合、直ちにエラーが報告されます。
-
ドメインエラー:
<date>部分が無効な場合(有効なグレゴリオ暦の日付にならない場合)、エラーが報告されます。
例
現在の Doris のタイムゾーンが UTC+8(+08:00)であると仮定します。タイムゾーンが時刻型の解析に与える影響については、タイムゾーンのドキュメントを参照してください。
| 文字列 | DATE 型への変換結果 | 説明 |
|---|---|---|
2023-07-16T19:20:30.123+08:00 | 2023-07-16 | 区切り文字付きの日付 + 'T' + 秒とミリ秒 + 数値オフセット |
2023-07-16T19+08:00 | 2023-07-16 | 時刻は分と秒を省略した連結形式。UTC+8 に変換しても結果は変わりません。 |
2023-07-16T1920+08:00 | 2023-07-16 | 時刻は秒を省略した連結形式。UTC+8 に変換しても結果は変わりません。 |
70-1-1T00:00:00-0000 | 1970-01-01 | 二桁の年 + 一桁または二桁の月と日 + 区切り文字 + 連結形式のオフセット |
19991231T235960.5UTC | 1999-12-31 | 連結形式の日付 + 'T' + 連結形式の時刻 + 小数部分 + UTC |
2024-02-29 12:00:00 Europe/Paris | 2024-02-29 | 有効なうるう年の日付 + スペース + 完全な時刻 + スペース + タイムゾーン名 |
2024-05-01T00:00Asia/Shanghai | 2024-05-01 | 不完全な時刻 + タイムゾーン名 |
20231005T081530Europe/London | 2023-10-05 | 連結形式の日付 + タイムゾーン名 |
85-12-25T0000gMt | 1985-12-25 | 大文字と小文字が混在したタイムゾーン |
2024-05-01 | 2024-05-01 | 日付のみ |
24-5-1 | 2024-05-01 | 2 桁の年 + 1 桁の月 + 1 桁の日 |
2024-05-01 0:1:2.333 | 2024-05-01 | 連結形式の日付 + 'T' + 一桁の時・分・秒 + ミリ秒 |
2024-05-01 0:1:2. | 2024-05-01 | 連結形式の日付 + 'T' + 一桁の時・分・秒 + 数字を伴わない小数点 |
20240501 01 | 2024-05-01 | 連結形式の日付 + スペース + 分と秒を省略 |
20230716 1920Z | 2023-07-16 | 連結形式の日付 + スペース + 連結形式の時・分 + UTC の 'Z' |
20240501T0000 | 2024-05-01 | 連結形式の日付 + 'T' + 秒を省略した連結形式の時刻 |
2024-12-31 23:59:59.9999999 | 2024-12-31 | 区切り文字付きの日付 + スペース + ミリ秒を含む時刻。時刻部分は無視されます。 |
2025/06/15T00:00:00.99999999999999 | 2025-06-15 | 小数点以下の桁数に制限はありません。 |
2020-12-12 13:12:12-03:00 | 2020-12-12 | 桁上がりなし |
0023-01-01T00:00Z | 0023-01-01 | 有効な四桁の年 |
69-12-31 | 1969-12-31 | 二桁の年 69 → 1969-12-31 |
70-01-01 | 1970-01-01 | 二桁の年 70 → 1970-01-01 |
230102 | 2023-01-02 | 短い年を使用した連結形式の DATE |
19230101 | 1923-01-01 | 長い年を使用した連結形式の DATE |
120102030405 | Error (format error) | 日付と時刻の区切り文字がありません。 |
20120102030405.123 +08 | 2012-01-02 | 14 桁の連結形式の日付 + 小数部分 + 短いタイムゾーンオフセット |
120102030405.999 | Error (format error) | 日付と時刻の区切り文字がありません。 |
2020-05-05 12:30:60 | 2020-05-05 | 秒が無効ですが、DATE の解釈には使用されません。 |
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 は使用できません。 |
非厳密モード
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> ::= any symbol except digits or letters
<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} の桁数を超えるため無効です。
予期しない空白文字が現れた場合、それまでに解析済みのフィールドで結果を埋めることはせず、他の予期しない文字と同様に解析が失敗します。
ルールの説明
非厳密モードでは、厳密モードでサポートされるすべての形式に加えて、上記の BNF 定義に従う形式も解析できます。
全体構造
-
日付部分は必須です。時刻部分とタイムゾーン部分は省略できます。
-
文字列の先頭と末尾には任意の ASCII 空白文字を使用できます。日付と時刻はスペースまたは大文字の '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 は結果の DATE 値の該当部分を設定します。たとえば、一致した <year> の値を結果の年に、<fraction> の値を結果のマイクロ秒部分に設定します。入力に含まれない部分は結果で 0 に設定されます。
桁上がり
バージョン 4.0 以降、DATE 型の解析では <date> 以外の部分による桁上がりや数値への影響はありません。
桁上がりは発生しません。
エラー処理
-
形式エラー: 入力が上記 BNF のどの分岐にも一致しない場合、NULL を返します。
-
ドメインエラー:
<date>部分が無効な場合(有効なグレゴリオ暦の日付にならない場合)、NULL を返します。
バージョン 4.0 以降、DATE 型の解析では <date> 以外の部分にドメインエラーがあっても、結果に影響しません。
例
現在の Doris のタイムゾーンが UTC+8(+08:00)であると仮定します。タイムゾーンが時刻型の解析に与える影響については、タイムゾーンのドキュメントを参照してください。
| 文字列 | DATE 型への変換結果 | 説明 |
|---|---|---|
2023-7-4T9-5-3.1Z | 2023-07-04 | 先頭と末尾の空白文字。日付 2023-7-4(区切り文字は -、月と日に一桁を使用可能)。時刻とタイムゾーンは有効です。 |
99.12.31 23.59.59+05:30 | 1999-12-31 | . で日付と時刻を区切ります。タイムゾーンは +05:30(分の 30 は有効)。'T' はありません。 |
2000/01/01T00/00/00-230 | 2000-01-01 | 区切り文字は /。タイムゾーンの -230 はコロンを省略し、時を一桁で表しています。 |
85 1 1T0 0 0. CST | 1985-01-01 | すべてのフィールドをスペースで区切ります。二桁の年は 1985 に対応します。小数点以下の数字はゼロ桁です。短いタイムゾーン名は大文字と小文字を区別しません。 |
2024-02-29T23:59:59.999999 UTC | 2024-02-29 | 有効なうるう年。精度の高い小数部分は桁上がりしません。特定のタイムゾーン名を使用します。 |
70-01-01T00:00:00+14 | 1970-01-01 | 二桁の年 1970。有効な最大オフセット +14。分の部分はありません。 |
0023-1-1T1:2:3. -00:00 | 0023-01-01 | 四桁の年 0023。時刻フィールドに一桁と二桁が混在します。小数点以下の数字はゼロ桁です。分に符号のないオフセットです。 |
2025/06/15T00:00:00.0-0 | 2025-06-15 | 区切り文字は /。小数点以下は一桁です。オフセット -0 は -00:00 と同等です。 |
2025/06/15T00:00:00.99999999999 | 2025-06-15 | 小数点以下の桁数に制限はなく、無視されます。 |
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 を表していました。現在はサポートされません。 |
12121 | NULL (format error) | 動作の変更: 以前は 2012-12-12 を表していました。現在はサポートされません。 |
数値からの変換
すべての数値型から DATE 型への変換をサポートします。
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
エラー処理
ルールに従って解析しても入力から有効な DATE 値を生成できない場合、エラーが報告されます。
例
| 数値 | DATE 型への変換結果 | 説明 |
|---|---|---|
123.123 | 2000-01-23 | 3 桁の数値 |
20150102030405 | 2015-01-02 | 14 桁の数値 |
20150102030405.123456 | 2015-01-02 | 14 桁の数値、有効な小数部分 |
20151231235959.99999999999 | 2015-12-31 | 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
エラー処理
ルールに従って解析しても入力から有効な DATE 値を生成できない場合、NULL を返します。
例
| 数値 | DATE 型への変換結果 | 説明 |
|---|---|---|
123.123 | 2000-01-23 | 3 桁の数値 |
20150102030405 | 2015-01-02 | 14 桁の数値 |
20150102030405.123456 | 2015-01-02 | 14 桁の数値、有効な小数部分 |
20151231235959.99999999999 | 2015-12-31 | 14 桁の数値、有効な小数部分 |
1000 | NULL | 2000-10-00 の日が無効 |
-123.123 | NULL | 負の時刻から有効な日付は生成できません。 |
日付・時刻型からの変換
Datetime 型と Time 型から Date 型への変換をサポートします。
Datetime
ルールの説明
Datetime から変換する場合、結果は入力の日付部分になります。この変換は常に有効です。
例
| 入力 Datetime | Date 型への変換結果 |
|---|---|
2012-02-05 12:35:24.123456 | 2012-02-05 |
Time
ルールの説明
Time から変換する場合、結果は現在の日付に入力の Time を加えた値になります。この変換は予測可能な将来(9999 年の十二月より前)において有効なため、Doris は常に有効と見なします。
例
現在の日付が 2025-04-29 であると仮定します。
| 入力 Time | Date 型への変換結果 |
|---|---|
500:00:00 | 2025-05-19 |
23:59:59 | 2025-04-29 |
-128:00:00 | 2025-04-23 |
TIMESTAMP_NS
ルールの説明
TIMESTAMP_NS から変換する場合、Doris は日付部分を返し、時刻部分と秒の小数部分を丸めずに破棄します。有効な TIMESTAMP_NS 値はすべて DATE の範囲内にあるため、厳密モードと非厳密モードのどちらでも変換は必ず成功します。入力が NULL の場合は NULL を返します。
例
| 入力 TIMESTAMP_NS | DATE 型への変換結果 |
|---|---|
1677-09-21 00:12:43.145224192 | 1677-09-21 |
1969-12-31 23:59:59.999999999 | 1969-12-31 |
2024-02-29 12:34:56.123456789 | 2024-02-29 |
2262-04-11 23:47:16.854775807 | 2262-04-11 |