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桁連続整数フォーマットのみがサポートされ、これはstrict modeで強制され、non-strict modeに継承されます。
各フィールドの解析では、先頭の余分なゼロによる長さの超過が許可されなくなりました。例えば、<day> ::= <digit>{1,2}に対して00012は無効です。
予期しない空白文字が検出された場合、解析は他の予期しない文字と同様に失敗し、すでに解析されたフィールドを使用して結果を埋めることはありません。
規則の説明
non-strict modeでは、strict modeでサポートされているすべてのフォーマットを解析でき、さらに上記のBNF定義に従った解析がサポートされます。
全体構造
-
日付部分は必須です;時刻部分とタイムゾーン部分はオプションです。
-
文字列の先頭または末尾にASCII空白文字が表示される場合があります;日付と時刻はスペースまたは大文字の'T'で区切られます;入力フィールド間の区切り文字として、数字と文字以外の任意の記号を使用できます;timezoneはオプションです。
-
ASCII文字のみが受け入れられます。入力文字列に非ASCII文字が表示された場合、上記のBNF定義を満たさず、フォーマットエラーと見なされます。
日付部分<date>と時刻部分<time>
-
<separator>: 数字と文字以外の任意の記号; -
<year>: 2桁または4桁。-
2桁年(00-99):< 70 → 2000+ 2桁;≥ 70 → 1900+ 2桁。
-
4桁年は直接使用されます。
-
-
<fraction>(オプション):小数点以下の任意桁数。 -
その他の数値フィールド:1桁または2桁。
タイムゾーン部分<timezone>(strict modeと同様)
-
日付とタイムゾーンの間に任意の空白文字が許可されます。
-
大文字小文字は区別されません。
-
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桁の月/日をサポート);時刻とtimezoneは有効 |
99.12.31 23.59.59+05:30 | 1999-12-31 | .が日付と時刻を区切る;timezone +05:30(分30は有効);'T'なし |
2000/01/01T00/00/00-230 | 2000-01-01 | /区切り文字;colonなしで1桁時間のtimezone `-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(フォーマットエラー) | 秒が範囲外 |
2024 12 31T121212.123456 America/New_York | NULL(フォーマットエラー) | 区切り文字なしの純粋な数値時刻 |
123.123 | NULL(フォーマットエラー) | 動作変更:以前は2012-03-12を表していた。現在はサポートされない。 |
12121 | NULL(フォーマットエラー) | 動作変更:以前は2012-12-12を表していた。現在はサポートされない。 |
数値から
すべての数値型からDATE型への変換をサポートします。
4.0以降、DECIMAL型はそのリテラル数値に従って変換されます。BooleanからTimeタイプへの変換はサポートされません。数値入力の小数部分の解析がサポートされます。
Strict Mode
規則の説明
有効フォーマット
整数桁の場合、数値は最下位桁から最上位桁へ、日付の右端から左に向かって埋められます。以下は有効なフォーマットとそれに対応する埋め結果です(マイクロ秒部分を除く):
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値を生成できない場合、エラーが報告されます。
例
| 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 | Error | 2000-10-00で無効な日 |
-123.123 | Error | 負の時間は有効な日付を生成できません |
Non-strict Mode
エラーハンドリングを除いて、non-strict modeの動作はstrict modeと全く同じです。
ルールの説明
有効なフォーマット
整数桁については、数値は最下位桁から最上位桁へ、日付の右端から左へ埋められます。以下は有効なフォーマットとそれに対応する埋め込み結果です(マイクロ秒部分を除く):
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 | 負の時間は有効な日付を生成できません |
日付型からの変換
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 |