メインコンテンツまでスキップ
バージョン: 26.x

DATE型へのキャスト

DATE型の有効な範囲: [0000-01-01, 9999-12-31]

FROM String

Strict Mode

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>
  • 2つのフォーマットが許可される:

    • セパレータ付き: YYYY-MM-DD など

    • 連結形式: YYYYMMDD など

  • <year>: 2桁または4桁

    • 2桁の年(00-99): < 70 → 2000+ 2桁; ≥ 70 → 1900+ 2桁

    • 4桁の年はそのまま使用される。

  • セパレータとしては '-' のみがサポートされる。

  • <year><month><day> はセパレータ付きフォーマットでは異なる長さをサポートし、連結フォーマットでは、<year> は2桁または4桁をサポートし、その他は2桁固定。

時刻部分 <time>
  • 2つのフォーマットが許可される:

    • セパレータ付き: HH[:MM[:SS[.fraction]]] など

    • 連結形式: HH[MM[SS[.fraction]]] など

  • <hour>: 0–23

  • <minute>: 0–59

  • <second>: 0–59

  • <fraction>: 小数点以下の任意桁数で、秒の小数部分を表す。最高位の桁は0.1秒(100ミリ秒)に対応する。

  • <hour><minute><second> はセパレータ付きフォーマットでは1-2桁を許可し、連結フォーマットでは長さは2桁固定。

  • 左から連続するいくつかのフィールドのみが出現でき、残りは省略される。例えば、<hour> + <minute> は有効だが、<hour> + <fraction> は無効。

連続桁フォーマット <digit>{14}
  • 年、月、日、時、分、秒に対して4桁-2桁-2桁-2桁-2桁-2桁として解釈される。

  • その後、ルールに従って可能な小数部分とタイムゾーン部分を解析する。

タイムゾーン部分 <offset>
  • 日付とタイムゾーンの間には任意の空白文字が許可される

  • 大文字小文字を区別しない

  • 3つのタイプが許可される:

    1. 数値オフセット: (+|-)HH[:MM] または (+|-)HHMM など

      • <hour-offset>: 0–14、1桁の値の場合は先頭の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管理のTimezone Databaseに含まれるすべての有効なタイムゾーン名(Europe/ParisEtc/GMT+2 など)、大文字小文字を区別しない。

      • タイムゾーン名の利用可能性については、Timezoneドキュメントを参照。
空白文字
  • <whitespace>:スペース、タブ、改行などを含む任意の空白文字
解析ロジック

<datetime> のすべての入力フィールドが有効な入力文字列に対して、Dorisは <date> 部分のみを読み取り、その結果を変換後のターゲット値として使用する。入力は、フィールドに応じて結果の対応する部分に割り当てられる。例えば、<year> のマッチング結果は結果の年部分を設定し、<month> のマッチング結果は結果の月部分を設定し、<day> のマッチング結果は結果の日部分を設定する。

具体的には、入力日付の結果が0000年00月00日で、BE CONFIG allow_zero_datetrue の場合、ドメインエラーとはみなされず、生成される結果は0000年01月01日となる。

繰り上がり

繰り上がりは発生しない。

エラー処理
  • フォーマットエラー: 入力が上記のBNFブランチのいずれにもマッチしない場合、即座にエラーが報告される。

  • ドメインエラー: <date> 部分が無効(つまり、有効なグレゴリオ暦の日付にならない)場合、エラーが報告される。

現在のDorisタイムゾーンがUTC+8(+08:00)であると仮定する。タイムゾーンが時刻型解析に与える影響については、Time Zoneドキュメントを参照。

文字列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-012桁年 + 1桁/2桁月/日 + セパレータ + 連結オフセット
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' + 1桁時/分/秒 + ミリ秒
2024-05-01 0:1:2.2024-05-01連結日付 + 'T' + 1桁時/分/秒 + 単独小数点
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有効な4桁年
69-12-311969-12-312桁年69 → 1969-12-31
70-01-011970-01-012桁年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一般的に: エラー(フォーマットエラー)未知のタイムゾーン略語(Time Zoneドキュメントを参照)
2024-5-1T24:00エラー(ドメインエラー)時24が範囲外
2024-02-30エラー(ドメインエラー)2月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桁の連続整数フォーマットのみがサポートされ、これは厳密モードで強制され、非厳密モードにも継承されます。

各フィールドの解析では、先頭の余分なゼロによる長さの超過は許可されなくなりました。例えば、<day> ::= <digit>{1,2}に対する00012は無効です。

予期しない空白文字が検出された場合、他の予期しない文字と同様に解析は失敗し、既に解析されたフィールドを使用して結果を埋めることはありません。

ルールの説明

非厳密モードでは、厳密モードでサポートされるすべてのフォーマットを解析でき、さらに上記のBNF定義に従った解析がサポートされます。

全体構造
  • 日付部分は必須です;時刻部分とタイムゾーン部分はオプションです。

  • ASCII空白文字は文字列の開始または終了に現れることがあります;日付と時刻は空白または大文字の'T'で区切られます;数字と文字以外の任意の記号を入力フィールド間の区切り文字として使用できます;タイムゾーンはオプションです。

  • ASCII文字のみが受け入れられます。非ASCII文字が入力文字列に現れた場合、上記のBNF定義を満たさず、フォーマットエラーと見なされます。

日付部分<date>と時刻部分<time>
  • <separator>:数字と文字以外の任意の記号;

  • <year>:2桁または4桁。

    • 2桁年(00-99):< 70 → 2000+2桁;≥ 70 → 1900+2桁。

    • 4桁年は直接使用されます。

  • <fraction>(オプション):小数点以下の任意の桁数。

  • その他の数値フィールド:1桁または2桁。

タイムゾーン部分<timezone>(厳密モードと同じ)
  • 日付とタイムゾーンの間に任意の空白文字が許可されます。

  • 大文字小文字は区別されません。

  • 3種類が許可されます:

    1. 数値オフセット:(+|-)HH[:MM]または(+|-)HHMM

      • <hour-offset>:0–14、1桁の値では先頭の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管理のTimezone Databaseに含まれるすべての有効なタイムゾーン名(Europe/ParisEtc/GMT+2など)、大文字小文字を区別しません。

      • タイムゾーン名の可用性については、Timezoneドキュメントを参照してください。
空白文字
  • <whitespace>:空白、タブ、改行などを含む任意の空白文字。
解析ロジック

上記のBNF定義を満たす任意の入力文字列について、Dorisは結果のDateの対応する部分を埋めます。例えば、結果の年部分はマッチした<year>値に設定され、結果のマイクロ秒部分はマッチした<fraction>値に設定されます。入力に現れない部分は結果で0に設定されます。

繰り上がり
動作の変更

バージョン4.0以降、DATE型を解析する際、<date>以外の部分は繰り上がりや数値的影響を生成しません。

繰り上がりは発生しません。

エラーハンドリング
  • フォーマットエラー:入力が上記のBNF分岐のいずれにもマッチしない場合、戻り値はNULLです。

  • ドメインエラー<date>部分が無効(つまり、有効なグレゴリオ暦の日付にならない)場合、戻り値はNULLです。

動作の変更

バージョン4.0以降、DATE型を解析する際、<date>以外の部分にドメインエラーがあっても、結果に影響しません。

現在のDorisタイムゾーンをUTC+8(+08:00)と仮定します。タイムゾーンが時刻型解析に与える影響については、Time Zoneドキュメントを参照してください。

StringCast as DATE ResultComment
2023-7-4T9-5-3.1Z2023-07-04先頭と末尾の空白文字;日付2023-7-4-区切り文字、1桁の月/日をサポート);時刻とタイムゾーンは有効
99.12.31 23.59.59+05:301999-12-31.が日付と時刻を区切る;タイムゾーン+05:30(分30は有効);'T'なし
2000/01/01T00/00/00-2302000-01-01/区切り文字;コロンなしのタイムゾーンと1桁時間-230
85 1 1T0 0 0. CST1985-01-01すべてのフィールドが空白で区切られる;2桁年は1985にマップ;小数点以下0桁;短いタイムゾーン名は大文字小文字を区別しない
2024-02-29T23:59:59.999999 UTC2024-02-29有効なうるう年;高精度小数は繰り上がらない;特定のタイムゾーン名
70-01-01T00:00:00+141970-01-012桁年1970;最大合法オフセット+14;分部分なし
0023-1-1T1:2:3. -00:000023-01-014桁年0023;1桁/2桁混合時刻フィールド;小数点以下0桁;分の符号なしオフセット
2025/06/15T00:00:00.0-02025-06-15/区切り文字;小数点以下1桁;オフセット-0-00:00と同等)
2025/06/15T00:00:00.999999999992025-06-15任意の小数桁数、無視される
2024-02-29T23-59-60ZULUNULL (format error)秒が範囲外
2024 12 31T121212.123456 America/New_YorkNULL (format error)区切り文字なしの純粋な数値時刻
123.123NULL (format error)動作の変更:以前は2012-03-12を表していました。現在はサポートされません。
12121NULL (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.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が返されます。

NumberCast as DATE ResultComment
123.1232000-01-233桁の数値
201501020304052015-01-0214桁の数値
20150102030405.1234562015-01-0214桁の数値、有効な小数
20151231235959.999999999992015-12-3114桁の数値、有効な小数
1000NULL2000-10-00の無効な日
-123.123NULL負の時刻は有効な日付を生成できません

Datelike型から

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

Datetime

ルールの説明

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

Input DatetimeCast as Date Result
2012-02-05 12:35:24.1234562012-02-05

Time

ルールの説明

Timeから変換する場合、結果は現在の日付とTime入力の合計になります。この変換は予見可能な将来(9999年12月より前)において有効であるため、Dorisは常に有効と見なします。

現在の日付が2025-04-29であると仮定すると:

Input TimeCast as Date Result
500:00:002025-05-19
23:59:592025-04-29
-128:00:002025-04-23