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 CONFIG の 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 | エラー(形式エラー) | DATE と TIME の間の区切り文字がありません。 |
20120102030405.123 +08 | 2012-01-02 | 14 桁の連結形式の日付 + 小数部分 + 短いタイムゾーンオフセット |
120102030405.999 | エラー(形式エラー) | DATE と TIME の間の区切り文字がありません。 |
2020-05-05 12:30:60 | 2020-05-05 | 秒が無効ですが、DATE の解釈には含まれません。 |
2023-07-16T19.123+08:00 | エラー(形式エラー) | 日付に連続していないフィールドが含まれます(時 + ミリ秒で、分と秒を飛ばしています)。 |
2024/05/01 | 2024-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 で無効 |
非厳格モード
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(形式エラー) | 秒が範囲外 |
2024 12 31T121212.123456 America/New_York | NULL(形式エラー) | 区切り文字のない数字のみの時刻 |
123.123 | NULL(形式エラー) | 動作の変更: 以前は 2012-03-12 を表していました。現在はサポートされません。 |
12121 | NULL(形式エラー) | 動作の変更: 以前は 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 | エラー | 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
エラー処理
ルールに従って解析しても有効な 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 |