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つのタイプが許可される:
-
数値オフセット:
(+|-)HH[:MM]または(+|-)HHMMなど-
<hour-offset>: 0–14、1桁の値の場合は先頭の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管理のTimezone Databaseに含まれるすべての有効なタイムゾーン名(
Europe/Paris、Etc/GMT+2など)、大文字小文字を区別しない。- タイムゾーン名の利用可能性については、Timezoneドキュメントを参照。
-
空白文字
<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)であると仮定する。タイムゾーンが時刻型解析に与える影響については、Time Zoneドキュメントを参照。
| 文字列 | 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 | 2桁年 + 1桁/2桁月/日 + セパレータ + 連結オフセット |
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' + 1桁時/分/秒 + ミリ秒 |
2024-05-01 0:1:2. | 2024-05-01 | 連結日付 + 'T' + 1桁時/分/秒 + 単独小数点 |
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 | 有効な4桁年 |
69-12-31 | 1969-12-31 | 2桁年69 → 1969-12-31 |
70-01-01 | 1970-01-01 | 2桁年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 | 一般的に: エラー(フォーマットエラー) | 未知のタイムゾーン略語(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種類が許可されます:
-
数値オフセット:
(+|-)HH[:MM]または(+|-)HHMM-
<hour-offset>:0–14、1桁の値では先頭の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管理のTimezone Databaseに含まれるすべての有効なタイムゾーン名(
Europe/Paris、Etc/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ドキュメントを参照してください。
| String | Cast as DATE Result | Comment |
|---|---|---|
2023-7-4T9-5-3.1Z | 2023-07-04 | 先頭と末尾の空白文字;日付2023-7-4(-区切り文字、1桁の月/日をサポート);時刻とタイムゾーンは有効 |
99.12.31 23.59.59+05:30 | 1999-12-31 | .が日付と時刻を区切る;タイムゾーン+05:30(分30は有効);'T'なし |
2000/01/01T00/00/00-230 | 2000-01-01 | /区切り文字;コロンなしのタイムゾーンと1桁時間-230 |
85 1 1T0 0 0. CST | 1985-01-01 | すべてのフィールドが空白で区切られる;2桁年は1985にマップ;小数点以下0桁;短いタイムゾーン名は大文字小文字を区別しない |
2024-02-29T23:59:59.999999 UTC | 2024-02-29 | 有効なうるう年;高精度小数は繰り上がらない;特定のタイムゾーン名 |
70-01-01T00:00:00+14 | 1970-01-01 | 2桁年1970;最大合法オフセット+14;分部分なし |
0023-1-1T1:2:3. -00:00 | 0023-01-01 | 4桁年0023;1桁/2桁混合時刻フィールド;小数点以下0桁;分の符号なしオフセット |
2025/06/15T00:00:00.0-0 | 2025-06-15 | /区切り文字;小数点以下1桁;オフセット-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 | エラー | 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が返されます。
例
| Number | Cast as DATE Result | Comment |
|---|---|---|
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 | 負の時刻は有効な日付を生成できません |
Datelike型から
Datetime型およびTime型からDate型への変換をサポートします。
Datetime
ルールの説明
Datetimeから変換する場合、結果は入力の日付部分になります。この変換は常に有効です。
例
| Input Datetime | Cast as Date Result |
|---|---|
2012-02-05 12:35:24.123456 | 2012-02-05 |
Time
ルールの説明
Timeから変換する場合、結果は現在の日付とTime入力の合計になります。この変換は予見可能な将来(9999年12月より前)において有効であるため、Dorisは常に有効と見なします。
例
現在の日付が2025-04-29であると仮定すると:
| Input Time | Cast as Date Result |
|---|---|
500:00:00 | 2025-05-19 |
23:59:59 | 2025-04-29 |
-128:00:00 | 2025-04-23 |