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

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>​
  • 日付とタイムゾーンの間には、任意の空白文字を使用できます。

  • 大文字と小文字を区別しません。

  • 次の三種類を使用できます。

    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 は <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:002023-07-16区切り文字ありの日付 + 「T」 + 秒とミリ秒 + 数値オフセット
2023-07-16T19+08:002023-07-16連結形式の時刻で、分と秒を省略。UTC+8 に変換しても結果は変わりません。
2023-07-16T1920+08:002023-07-16連結形式の時刻で、秒を省略。UTC+8 に変換しても結果は変わりません。
70-1-1T00:00:00-00001970-01-01二桁の年 + 一桁または二桁の月・日 + 区切り文字 + 連結形式のオフセット
19991231T235960.5UTC1999-12-31連結形式の日付 + 「T」 + 連結形式の時刻 + 小数部分 + UTC
2024-02-29 12:00:00 Europe/Paris2024-02-29有効なうるう年の日付 + スペース + 完全な時刻 + スペース + タイムゾーン名
2024-05-01T00:00Asia/Shanghai2024-05-01一部を省略した時刻 + タイムゾーン名
20231005T081530Europe/London2023-10-05連結形式の日付 + タイムゾーン名
85-12-25T0000gMt1985-12-25大文字と小文字が混在するタイムゾーン
2024-05-012024-05-01日付のみ
24-5-12024-05-012 桁の年 + 1 桁の月 + 1 桁の日
2024-05-01 0:1:2.3332024-05-01連結形式の日付 + 「T」 + 一桁の時・分・秒 + ミリ秒
2024-05-01 0:1:2.2024-05-01連結形式の日付 + 「T」 + 一桁の時・分・秒 + 単独の小数点
20240501 012024-05-01連結形式の日付 + スペース + 分と秒を省略
20230716 1920Z2023-07-16連結形式の日付 + スペース + 連結形式の時・分 + UTC の「Z」
20240501T00002024-05-01連結形式の日付 + 「T」 + 秒を省略した連結形式の時刻
2024-12-31 23:59:59.99999992024-12-31区切り文字ありの日付 + スペース + ミリ秒を含む時刻。時刻部分は無視されます。
2025/06/15T00:00:00.999999999999992025-06-15小数点以下は任意の桁数を使用できます。
2020-12-12 13:12:12-03:002020-12-12桁上がりなし
0023-01-01T00:00Z0023-01-01有効な四桁の年
69-12-311969-12-31二桁の年 69 → 1969-12-31
70-01-011970-01-01二桁の年 70 → 1970-01-01
2301022023-01-02短い年を使った連結形式の DATE
192301011923-01-01長い年を使った連結形式の DATE
120102030405エラー(形式エラー)DATE と TIME の間の区切り文字がありません。
20120102030405.123 +082012-01-0214 桁の連結形式の日付 + 小数部分 + 短いタイムゾーンオフセット
120102030405.999エラー(形式エラー)DATE と TIME の間の区切り文字がありません。
2020-05-05 12:30:602020-05-05秒が無効ですが、DATE の解釈には含まれません。
2023-07-16T19.123+08:00エラー(形式エラー)日付に連続していないフィールドが含まれます(時 + ミリ秒で、分と秒を飛ばしています)。
2024/05/012024-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>(厳格モードと同じ)​
  • 日付とタイムゾーンの間には、任意の空白文字を使用できます。

  • 大文字と小文字を区別しません。

  • 次の三種類を使用できます。

    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 は結果の 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.1Z2023-07-04先頭と末尾の空白文字。日付 2023-7-4(区切り文字は - で、一桁の月・日をサポート)。時刻とタイムゾーンは有効
99.12.31 23.59.59+05:301999-12-31. で日付と時刻を区切る。タイムゾーンは +05:30(分の 30 は有効)。「T」はありません。
2000/01/01T00/00/00-2302000-01-01区切り文字は /。タイムゾーンはコロンなしで時が一桁の `-230'
85 1 1T0 0 0. CST1985-01-01すべてのフィールドをスペースで区切る。二桁の年は 1985 に変換。小数点以下は零桁。短いタイムゾーン名では大文字と小文字を区別しません。
2024-02-29T23:59:59.999999 UTC2024-02-29有効なうるう年。高精度の小数部分による桁上がりはありません。特定のタイムゾーン名
70-01-01T00:00:00+141970-01-01二桁の年 1970。許容される最大オフセット +14。分の部分はありません。
0023-1-1T1:2:3. -00:000023-01-01四桁の年 0023。時刻フィールドは一桁と二桁が混在。小数点以下は零桁。分には符号のないオフセット
2025/06/15T00:00:00.0-02025-06-15区切り文字は /。小数点以下は一桁。オフセット -0(-00:00 と同等)
2025/06/15T00:00:00.999999999992025-06-15小数点以下は任意の桁数を使用でき、無視されます。
2024-02-29T23-59-60ZULUNULL(形式エラー)秒が範囲外
2024 12 31T121212.123456 America/New_YorkNULL(形式エラー)区切り文字のない数字のみの時刻
123.123NULL(形式エラー)動作の変更: 以前は 2012-03-12 を表していました。現在はサポートされません。
12121NULL(形式エラー)動作の変更: 以前は 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.1232000-01-233 桁の数値
201501020304052015-01-0214 桁の数値
20150102030405.1234562015-01-0214 桁の数値、有効な小数部分
20151231235959.999999999992015-12-3114 桁の数値、有効な小数部分
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.1232000-01-233 桁の数値
201501020304052015-01-0214 桁の数値
20150102030405.1234562015-01-0214 桁の数値、有効な小数部分
20151231235959.999999999992015-12-3114 桁の数値、有効な小数部分
1000NULL2000-10-00 の日が無効
-123.123NULL負の時刻から有効な日付は生成できません。

日付・時刻型からの変換​

Datetime 型および Time 型から Date 型への変換をサポートします。

Datetime​

ルールの説明​

Datetime から変換する場合、入力のうち日付部分が結果になります。この変換は常に有効です。

例​

入力 DatetimeDate への変換結果
2012-02-05 12:35:24.1234562012-02-05

Time​

ルールの説明​

Time から変換する場合、現在の日付に入力された Time を加えた結果になります。この変換は、予測できる将来(9999 年の十二月より前)において有効なため、Doris は常に有効とみなします。

例​

現在の日付が 2025-04-29 の場合、結果は次のとおりです。

入力 TimeDate への変換結果
500:00:002025-05-19
23:59:592025-04-29
-128:00:002025-04-23