DATETIME型へのキャスト
DATETIME型の有効範囲:
[0000-01-01 00:00:00.0000000, 9999-12-31 23:59:59.999999]
DATETIME型には型パラメータpが含まれており、これは小数点以下の桁数を表します。完全な表現はDATETIME(p)型です。例えば、DATETIME(6)はマイクロ秒精度をサポートするDATETIME型を示します。
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"
ルール記述
変換対象の型をDATETIME(<scale>)とし、<scale>は[0, 6]の範囲とする。
全体構造
-
日付部分は必須、時刻部分とタイムゾーン部分は任意です。
-
時刻が含まれる場合、日付と時刻は大文字「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は各フィールドの値をその意味に従ってResult Datetimeに格納します。入力はフィールドに従って結果の対応する部分に割り当てられます。例えば、<year>のマッチング結果は結果の年部分を設定し、<fraction>のマッチング結果は結果のマイクロ秒部分を設定します。入力に存在しないすべてのフィールドは、結果の対応する部分で0に設定されます。
特に、入力日付結果が0000年00月00日で、BE CONFIG allow_zero_dateがtrueの場合、ドメインエラーとは見なされず、生成される結果は0000年01月01日となります。
繰り上がり
-
<fraction>が小数点の後に<scale>より多くの桁数を持つ場合、<scale>桁に丸められます。この過程で繰り上がりが発生した場合、繰り上がりは通常通り発生し、最終的に結果の任意の部分に影響します。 -
入力に
<offset>部分が含まれる場合、繰り上がりが発生する可能性があります。<offset>は通常時刻値を変更します。時または分で繰り上がりが発生した場合、繰り上がりは通常通り発生し、最終的に結果の日付部分に影響します。 -
<offset>と<fraction>によって生成される繰り上がりは競合しないため、両方が同時に発生し、合成効果を持つことができます。
エラー処理
-
フォーマットエラー:入力が上記のBNF分岐のいずれにもマッチしない場合、即座にエラーが報告されます。
-
ドメインエラー:任意の部分が無効な値を持つ場合(結果が有効なグレゴリオ暦時刻ではない)、エラーが報告されます。
例
現在のDorisタイムゾーンをUTC+8(+08:00)とします。タイムゾーンが時刻タイプ解析に与える影響については、Time Zoneドキュメントを参照してください。結果はDATETIME(6)の例として取り上げており、これは6桁の小数位を収容できるDATETIMEです。
| 文字列 | DATETIME(6)への変換結果 | コメント |
|---|---|---|
2023-07-16T19:20:30.123+08:00 | 2023-07-16 19:20:30.123000 | セパレータありの日付 + "T" + 秒とミリ秒 + 数値オフセット。UTC+8への変換で結果は変更されません。 |
2023-07-16T19+08:00 | 2023-07-16 19:00:00.000000 | 連結時刻フォーマット、分と秒が省略。UTC+8への変換で結果は変更されません。 |
2023-07-16T1920+08:00 | 2023-07-16 19:20:00.000000 | 連結時刻フォーマット、秒が省略。UTC+8への変換で結果は変更されません。 |
70-1-1T00:00:00-0000 | 1970-01-01 08:00:00.000000 | 2桁年 + 1/2桁月日 + セパレータ + 連結オフセット。UTC+8への変換で8時間追加。 |
19991231T235959.5UTC | 2000-01-01 07:59:59.500000 | 連結日付 + "T" + 連結時分秒 + 小数部 + UTC。UTC+8への変換で8時間追加。 |
2024-05-01T00:00Asia/Shanghai | 2024-05-01 00:00:00.000000 | 不完全な時刻 + タイムゾーン名。UTC+8への変換で結果は変更されません。 |
20231005T081530Europe/London | 2023-10-05 15:15:30.000000 | 連結日付 + タイムゾーン名。夏時間中、GMT+1、UTC+8への変換で7時間追加。 |
20230105T081530 Europe/London | 2023-10-05 16:15:30.000000 | 連結日付 + タイムゾーン名。夏時間外、GMT+0、UTC+8への変換で8時間追加。 |
85-12-25T000000gMt | 1985-12-25 08:00:00.000000 | 大文字小文字混在のタイムゾーン。UTC+8への変換で8時間追加。 |
2024-05-01 | 2024-05-01 00:00:00.000000 | 日付のみ |
24-5-1 | 2024-05-01 00:00:00.000000 | 2桁年 + 1桁月日 |
2024-05-01 0:1:2.333 | 2024-05-01 00:01:02.333000 | セパレータありの日付 + "T" + 1桁時分秒 + ミリ秒 |
2024-05-01 0:1:2. | 2024-05-01 00:01:02.000000 | セパレータありの日付 + "T" + 1桁時分秒 + 小数点のみ |
20240501 01 | 2024-05-01 01:00:00.000000 | 連結日付 + "T" + 1桁時、分と秒を省略 |
20230716 1920Z | 2023-07-16 19:20:20.000000 | 連結日付 + スペース + 連結時分 + UTC "Z" |
2024-05-01T0000 | 2024-05-01 00:00:00.000000 | セパレータありの日付 + "T" + 連結時分、秒を省略 |
2024-12-31 23:59:59.9999999 | 2025-01-01 00:00:00.000000 | 年への繰り上がり |
2025/06/15T00:00:00.99999999999999 | 2025-06-15 00:00:01.000000 | 任意の桁数の小数位を許可、通常の繰り上がり |
2025/06/15T00:00:00.9999987 | 2025-06-15 00:00:00.999999 | マイクロ秒への繰り上がりが発生 |
2025/06/15T00:00:00.99999849 | 2025-06-15 00:00:00.999998 | 丸めは隣接桁のみ考慮、マイクロ秒への繰り上がりは発生しません。 |
2020-12-12 13:12:12-03:00 | 2020-12-13 00:12:12.000000 | 繰り上がりなし |
0023-01-01T00:00Z | 0023-01-01 08:00:00.000000 | 4桁年は有効 |
69-12-31 | 2069-12-31 00:00:00.000000 | 2桁年 69 → 2069-12-31 |
70-01-01 | 1970-01-01 00:00:00.000000 | 2桁年 70 → 1970-01-01 |
230102 | 2023-01-02 00:00:00.000000 | 短縮年DATE連結フォーマット |
19230101 | 1923-01-01 00:00:00.000000 | 長年DATE連結フォーマット |
120102030405 | エラー(フォーマットエラー) | DATE - TIME セパレータの不足 |
20120102030405.123 +08 | 2012-01-02 03:05:05.123000 | 14桁連結日付フォーマット + 小数部 + 短縮タイムゾーンオフセット |
120102030405.999 | エラー(フォーマットエラー) | DATE - TIME セパレータの不足 |
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は無効 |
9999-12-31 23:59:59.9999999 | エラー(ドメインエラー) | 小数位削減による繰り上がりで結果がドメイン上限を超過 |
非厳密モード
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> ::= ^(<digit> | <alpha>)
<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}に対して無効です。
予期しないスペースが発生した場合、他の予期しない文字と同様に解析は失敗し、既に解析されたフィールドで結果を埋めるのではなく、解析が失敗します。
ルールの説明
変換のターゲット型をDATETIME(<scale>)とします。ここで<scale>の値の範囲は[0, 6]です。
非厳密モードでは、厳密モードでサポートされるすべてのフォーマットが解析可能で、さらに上記のBNF定義に従った解析がサポートされます。
全体構造
-
日付部分は必須で、時刻部分とタイムゾーン部分はオプションです。
-
文字列は前後に任意の空白文字を持つことができ、日付と時刻はスペースまたは大文字の"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など)(大文字小文字を区別しない)- タイムゾーン名の利用可能性については、Time Zoneドキュメントを参照してください
-
空白文字
<whitespace>:スペース、タブ、改行などの任意の空白文字
解析ロジック
上記のBNF定義を満たす任意の入力文字列に対して、DorisはDatetime結果の対応する部分を埋めます。例えば、結果の年部分は一致した<year>値に設定され、結果のマイクロ秒部分は一致した<fraction>値に設定されます。入力に現れない部分は結果で0に設定されます。
特に、入力日付結果が0000-00-00で、BE CONFIG allow_zero_dateがtrueの場合、ドメインエラーとはみなされず、結果は0000-01-01に設定されます。
繰り上がり
-
<fraction>の小数点以下の桁数が<scale>を超える場合、<scale>の小数点以下の桁数に丸められます。この処理で繰り上がりが発生する場合、繰り上がりは正常に発生し、結果の任意の部分に影響します。 -
入力に
<offset>部分が含まれる場合、繰り上がりが発生する可能性があります。<offset>は通常時刻値を変更し、時または分で繰り上がりが発生した場合、繰り上がりは正常に発生し、結果の日付部分に影響します。 -
<offset>と<fraction>によって発生する繰り上がりは競合しないため、同時に発生し、結果に共に影響を与えることができます。
エラーハンドリング
-
フォーマットエラー:入力が上記のBNFブランチのいずれにも一致しない場合、戻り値はNULLです。
-
ドメインエラー:任意の部分が無効な値を持つ場合(結果が有効なグレゴリオ暦時刻ではない)、NULLが返されます。
例
現在のDorisタイムゾーンをUTC+8(+08:00)とします。タイムゾーンが時刻型解析に与える影響については、Time Zoneドキュメントを参照してください。結果は6桁の小数点を収容するDATETIME型であるDATETIME(6)を使用して表示されます。
| String | Cast as DATETIME(6) Result | Comment |
|---|---|---|
2023-7-4T9-5-3.1Z | 2023-07-04 17:05:03.100000 | 先頭と末尾のスペース;日付と時刻部分は-で区切られ、Tで2つの部分を区切り、タイムゾーンはZタイムゾーン(0タイムゾーン) |
99.12.31 23.59.59+05:30 | 2000-01-01 02:29:59.000000 | 日付と時刻部分は.で区切られる。タイムゾーン+05:30(分30は有効);"T"なし |
2000/01/01T00/00/00-230 | 2000-01-01 10:30:00.000000 | /セパレータ;コロンなしで1桁時間-230のタイムゾーン |
85 1 1T0 0 0. cst | 1985-01-01 00:00:00.000000 | スペースがすべてのフィールドを区切る;2桁年は1985にマップ;小数点以下ゼロ桁;短いタイムゾーン名は大文字小文字を区別しない |
2024-02-29T23:59:59.999999 UTC | 2024-03-01 07:59:59.999999 | うるう年は有効;繰り上がりなしの高精度小数;特定のタイムゾーン名 |
70-01-01T00:00:00+14 | 1969-12-31 18:00:00.000000 | 2桁年1970;最大有効オフセット+14;分部分なし |
0023-1-1T1:2:3. -00:00 | 0023-01-01 09:07:46.000000 | 4桁年0023;1桁/2桁時刻フィールドの混在;小数点以下ゼロ桁;分のサインなしオフセット |
2025/06/15T00:00:00.0-0 | 2025-06-15 08:00:00.000000 | /セパレータ;小数点以下1桁;オフセット-0(-00:00と等価) |
2025/06/15T00:00:00.99999999999 | 2025-06-15 00:00:01.000000 | 任意の小数点以下桁数、6桁の小数点以下に繰り上がり |
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 03:00:00.000000を表していました。現在はサポートされていません。 |
12121 | NULL (format error) | 動作変更:以前は2012-12-12 00:00:00.000000を表していました。現在はサポートされていません。 |
数値から
すべての数値型はDATETIME型に変換できます。
バージョン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 ij Hour kl Minute mn Second
小数部分については、小数点以下の日付の最左端(100ミリ秒の位)から上位から下位に向かって数値が埋められます。小数が不正確な表現型(float、double)の場合、Cast前に表現される実際の値を使用します。
繰り上がり
小数点以下の桁数が<scale>桁を超える場合、<scale>小数点以下の桁数に丸められます。この処理で繰り上がりが発生した場合、繰り上がりは正常に発生し、結果の任意の部分に影響を与えます。
エラーハンドリング
ルールに従って入力を有効なDATETIME値に解析できない場合、エラーが報告されます。
例
結果はDATETIME(3)を使用して表示されます。これは3桁の小数点以下を収容するDATETIME型です。
| Number | Cast as DATETIME(6) Result | Comment |
|---|---|---|
123.123 | 2000-01-23 00:00:00.123000 | 3桁の数値 + 小数 |
20150102030405 | 2015-01-02 03:04:05.000000 | 14桁の数値 |
20150102030405.123456 | 2015-01-02 03:04:05.123456 | 14桁の数値 + 小数 |
20151231235959.99999999999 | 2016-01-01 00:00:00.000000 | 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 ij Hour kl Minute mn Second
小数部分については、小数点以下の日付の最左端(百ミリ秒の位)から上位から下位に向かって数値が埋められます。小数が不正確な表現型(float、double)の場合、Cast前に実際に表現している値を使用します。
繰り上がり
小数点以下の桁数が<scale>桁を超える場合、<scale>桁に四捨五入されます。この処理で繰り上がりが発生した場合、繰り上がりは正常に発生し、結果のあらゆる部分に影響します。
エラーハンドリング
ルールに従って入力を有効なDATETIME値に解析できない場合、NULLが返されます。
例
結果は、6桁の小数点以下を収容するDATETIME型であるDATETIME(6)を使用して表示されます。
| Number | Cast as DATETIME(6) Result | Comment |
|---|---|---|
123.123 | 2000-01-23 00:00:00.123000 | 3桁の数値 + 小数 |
20150102030405 | 2015-01-02 03:04:05.000000 | 14桁の数値 |
20150102030405.123456 | 2015-01-02 03:04:05.123456 | 14桁の数値 + 小数 |
20151231235959.99999999999 | 2016-01-01 00:00:00.000000 | 14桁の数値、小数有効、年への繰り上がり |
1000 | NULL | 2000-10-00の日は無効 |
-123.123 | NULL | 負の時間は有効な日付を生成できない |
Date型からの変換
DateおよびTime型はDatetime型に変換できます。Datetimeは異なる精度値を持つため、異なる精度のDatetime型間の変換も存在します。
Date
ルール説明
Dateからの変換では、結果は入力日付部分に全て0の時刻部分を加えたものになります。この変換は常に有効です。
例
| Input DATE | Target タイプ | Cast as Datetime Result |
|---|---|---|
| 2012-02-05 | Datetime(0) | 2012-02-05 00:00:00 |
| 2012-02-05 | Datetime(6) | 2012-02-05 00:00:00.000000 |
Time
ルール説明
Timeからの変換では、結果は現在の日付の00:00:00時刻とTime入力の加算になります。この変換は予見可能な将来(9999年12月より前)において有効であるため、Dorisはこれを常に有効と見なします。
例
現在の日付が2025-04-29であると仮定すると:
| Input TIME | Cast as DATETIME(0) Result |
|---|---|
500:00:00 | 2025-05-19 20:00:00 |
23:59:59 | 2025-04-29 23:59:59 |
Datetime
厳密モード
ルール説明
低精度から高精度への変換では、新しく現れる小数点以下の桁は0で埋められ、この変換は常に有効です。
高精度から低精度への変換では、繰り上がりが発生し、それは前方に継続して伝播できます。オーバーフローが発生した場合、変換された値は無効になります。
エラーハンドリング
オーバーフローが発生した場合、エラーが報告されます。
例
現在の日付が2025-04-29であると仮定すると:
| Input DATETIME | Source タイプ | Target タイプ | Result DATETIME | Comment |
|---|---|---|---|---|
2020-12-12 00:00:00.123 | Datetime(3) | Datetime(6) | 2020-12-12 00:00:00.123000 | 精度向上 |
2020-12-12 00:00:00.123456 | Datetime(6) | Datetime(3) | 2020-12-12 00:00:00.123 | 精度低下、繰り上がりなし |
2020-12-12 00:00:00.99666 | Datetime(6) | Datetime(2) | 2020-12-12 00:00:01.00 | 精度低下、秒への繰り上がり |
9999-12-31 23:59:59.999999 | Datetime(6) | Datetime(5) | Error | 繰り上がりオーバーフロー、年10000の無効な日付を生成 |
非厳密モード
エラーハンドリングを除いて、非厳密モードの動作は厳密モードと全く同じです。
ルール説明
低精度から高精度への変換では、新しく現れる小数点以下の桁は0で埋められ、この変換は常に有効です。
高精度から低精度への変換では、繰り上がりが発生し、それは前方に継続して伝播できます。オーバーフローが発生した場合、変換された値は無効になります。
エラーハンドリング
オーバーフローが発生した場合、NULLが返されます。
例
現在の日付が2025-04-29であると仮定すると:
| Input DATETIME | Source タイプ | Target タイプ | Result DATETIME | Comment |
|---|---|---|---|---|
2020-12-12 00:00:00.123 | Datetime(3) | Datetime(6) | 2020-12-12 00:00:00.123000 | 精度向上 |
2020-12-12 00:00:00.123456 | Datetime(6) | Datetime(3) | 2020-12-12 00:00:00.123 | 精度低下、繰り上がりなし |
2020-12-12 00:00:00.99666 | Datetime(6) | Datetime(2) | 2020-12-12 00:00:01.00 | 精度低下、秒への繰り上がり |
9999-12-31 23:59:59.999999 | Datetime(6) | Datetime(5) | NULL | 繰り上がりオーバーフロー、年10000の無効な日付を生成 |