TIME型へのキャスト
TIME型の有効範囲は [-838:59:59.999999, 838:59:59.999999] です。
TIME型には型パラメータ p が含まれ、これは小数点以下の桁数を表します。完全な表現は TIME(p) 型です。例えば、TIME(6)はマイクロ秒精度をサポートするTIME型を表します。
FROM String
バージョン4.0以降、TIME型の解析はこのドキュメントに記載された形式のみをサポートし、Datetime型で許可されたルールによる二次変換は行われなくなりました。
Strict Mode
BNF定義
<time> ::= ("+" | "-")? (<colon-format> | <numeric-format>)
<colon-format> ::= <hour> ":" <minute> (":" <second> (<microsecond>)?)?
<hour> ::= <digit>+
<minute> ::= <digit>{1,2}
<second> ::= <digit>{1,2}
<numeric-format> ::= <digit>+ (<microsecond>)?
<microsecond> ::= "." <digit>*
<digit> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
ルールの説明
全体的な構造
2つの形式がサポートされています:<colon-format>と<numeric-format>。
-
最初はオプションのプラスまたはマイナス記号で、結果の符号を表します。
-
<colon-format>は順次以下を含みます:-
<hour>:0-23。最低1桁で、INT範囲を超えてはいけません。 -
<minute>:0-59。1桁または2桁で、<hour>との間にセパレータ:が必要です。 -
<second>:オプション。0-59。1桁または2桁で、<minute>との間にセパレータ:が必要です。デフォルト値は0です。 -
<microsecond>:オプション、.で始まり任意の桁数が続きます。デフォルト値は0です。
-
-
<numeric-format>は順次以下を含みます:-
連続する数字の文字列で、連続した時、分、秒のフィールドとして扱われます。右寄せ、つまり入力の1の位が結果の秒の位に合わせられ、その後左に順次埋められます。例えば、入力の千の位は結果の分の十の位に合わせられます。
-
<microsecond>フィールドと同じオプションの小数部分。pを超える桁数はp小数点以下に丸められます。
-
エラー処理
-
形式エラー:上記のBNF分岐のいずれにも適合しない場合、即座にエラーが報告されます。
-
ドメインエラー:結果が有効な時刻でない場合、またはTIME型のドメインを超える場合、エラーが報告されます。
例
| String | Cast as TIME(6) Result | Comment |
|---|---|---|
1 | 00:00:01.000000 | 1の位を秒の位に合わせ |
123 | 00:01:23.000000 | 1の位を秒の位に合わせ、左に拡張 |
2005959.12 | 200:59:59.120000 | 小数点入力 |
0.12 | 00:00:00.120000 | 数値形式0時間入力+小数 |
00:00:00.12 | 00:00:00.120000 | 区切り形式0時間入力+小数 |
123. | 00:01:23.000000 | 小数点は0桁を許可 |
123.0 | 00:01:23.000000 | 小数点1桁0 |
123.123 | 00:01:23.123000 | 有効な小数 |
-1 | -00:00:01.000000 | 負の入力 |
12-34:56.1 | Error (format error) | '-'は有効なセパレータではありません |
12 : 34 : 56 | Error (format error) | 無効な空白文字 |
76 | Error (domain error) | 76秒は無効 |
200595912 | Error (domain error) | 20059時間は無効 |
8385959.9999999 | Error (domain error) | 繰り上がりが上限を超過 |
非厳密モード
4.0から、DECIMAL型はそのリテラル値表現に従って変換されます。<microsecond>フィールドをマイクロ秒まで解析することをサポートします。境界を超える形式はエラーとみなされ、それに応じて処理されます。
非厳密モードは先頭と末尾の空白をサポートし、エラー処理は厳密モードとは異なります。
BNF定義
<time> ::= <whitespace>* ("+" | "-")? (<colon-format> | <numeric-format>) <whitespace>*
<colon-format> ::= <hour> ":" <minute> (":" <second> (<microsecond>)?)?
<hour> ::= <digit>+
<minute> ::= <digit>{1,2}
<second> ::= <digit>{1,2}
<numeric-format> ::= <digit>+ (<microsecond>)?
<microsecond> ::= "." <digit>*
<digit> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
<whitespace> ::= " " | "\t" | "\n" | "\r" | "\v" | "\f"
ルールの説明
全体構造
<colon-format>と<numeric-format>の2つの形式がサポートされています。
-
時刻の符号を表すオプションの符号。
-
<colon-format>には以下が含まれます:-
<hour>: 0-23。少なくとも1桁、INT範囲を超えない。 -
<minute>: 0-59。1桁または2桁、:で区切られる。 -
<second>: オプション。0-59。1桁または2桁、:で区切られる。 -
<microsecond>: オプション。.で始まり、任意の桁数が続く。
-
-
<numeric-format>には以下が含まれます:-
連続する数字の文字列で、連続する時、分、秒のフィールドとして扱われる。最右端の桁が秒フィールドに対応し、残りは右から左に埋められる。
-
オプションの小数部、
<microsecond>と同じ。余分な桁は指定されたp小数点以下の桁数に丸められる。
-
エラーハンドリング
-
フォーマットエラー: どちらのBNF分岐とも一致しない場合、NULLを返す。
-
ドメインエラー: 結果が有効な時刻でないか、TIME型の範囲を超える場合、NULLを返す。
例
| 入力文字列 | TIME(6)変換結果 | コメント |
|---|---|---|
1 | 00:00:01.000000 | 最右端の桁が秒に対応 |
123 | 00:01:23.000000 | 最右端の桁が秒に対応、右から左に埋める |
2005959.12 | 200:59:59.120000 | 小数入力 |
0.12 | 00:00:00.120000 | 数値形式0時刻入力 + 小数 |
00:00:00.12 | 00:00:00.120000 | コロン形式0時刻入力 + 小数 |
123. | 00:01:23.000000 | 小数は0桁も許可 |
123.0 | 00:01:23.000000 | 小数1桁0 |
123.123 | 00:01:23.123000 | 有効な小数 |
-1 | -00:00:01.000000 | 負の入力 |
-800:05:05 | -800:05:05.000000 | 3桁の時、負 |
-991213.56 | -99:12:13.560000 | 負の入力 |
80302.9999999 | 08:03:03.000000 | 小数が6桁を超える、繰り上がり |
5656.3000000009 | 00:56:56.300000 | 下位小数桁を破棄 |
5656.3000007001 | 00:56:56.300001 | マイクロ秒への丸め |
1 | NULL | 無効なフォーマット、BNFが空白にマッチしない |
.123 | NULL | 小数点前にフィールドなし |
:12:34 | NULL | 時が欠如 |
12-34:56.1 | NULL | '-'は有効なセパレータでない |
12 : 34 : 56 | NULL | 無効な空白 |
76 | NULL | 76秒は無効 |
200595912 | NULL | 20059時は無効 |
8385959.9999999 | NULL | 繰り上がりが上限を超過 |
数値から
すべての数値型はTIME型に変換できます。
バージョン4.0以降、Dorisは小数部の解析をサポートし、任意の数値型のTime型への変換をサポートします。
厳密モード
ルールの説明
有効なフォーマット
整数の桁については、数字は最低位から最高位へ、日付の最右端から左に向かって埋められます。以下は有効なフォーマットとそれに対応する埋め込み結果です(マイクロ秒部分を除く):
1-digit number(a) 00:00:0a
2-digit number(ab) 00:00:ab
3-digit number(abc) 00:0a:bc
4-digit number(abcd) 00:ab:cd
5-digit number(abcde) 0a:bc:de
6-digit number(abcdef) ab:cd:ef
7-digit number(abcdefg) abc:de:fg
小数部については、小数点以降の最左端(百ミリ秒の位)から右へ、最上位の桁から最下位の桁まで順番に埋められます。小数が非正確表現型(float、double)の場合、Cast直前の実際の値を使用します。p桁を超える桁はp小数点以下の桁数に丸められます。
入力が負の場合、結果は符号を反転した解析値になります。
Error Handling
ルールに従って入力が有効なTIME値として解析できない場合、エラーが報告されます。
Examples
| Number | Cast as TIME(3) Result | Comment |
|---|---|---|
123456 | 12:34:56.000 | |
-123456 | -12:34:56.000 | |
123 | 00:01:23.000 | |
6.99999 | 00:00:07.000 | |
-0.99 | -00:00:00.990 | |
8501212 | 850:12:12.000 | |
20001212 | Error | Length out of range |
9000000 | Error | Hour 900 exceeds upper limit |
67 | Error | Second 67 is invalid |
Non-strict Mode
エラーハンドリングを除き、non-strict modeでの動作はstrict modeと完全に一致します。
Rule デスクリプション
Valid Formats
整数桁については、時刻の最右端から左へ、最下位の桁から最上位の桁まで順番に埋められます。以下は有効な形式とそれに対応する埋め込み結果です(マイクロ秒部分は除く):
1-digit number(a) 00:00:0a
2-digit number(ab) 00:00:ab
3-digit number(abc) 00:0a:bc
4-digit number(abcd) 00:ab:cd
5-digit number(abcde) 0a:bc:de
6-digit number(abcdef) ab:cd:ef
7-digit number(abcdefg) abc:de:fg
小数部分については、数値は小数点以下の日付の最左端(百ミリ秒の位)から上位から下位に向かって埋められます。小数が不正確な表現型(float、double)の場合、Castの前にそれが表す実際の値を使用します。
入力が負の場合、結果は符号を反転した解析値になります。
エラー処理
ルールに従って入力を有効なTIME値に解析できない場合、NULLが返されます。
例
| Number | Cast as TIME(3) Result | Comment |
|---|---|---|
123456 | 12:34:56.000 | |
-123456 | -12:34:56.000 | |
123 | 00:01:23.000 | |
6.99999 | 00:00:07.000 | |
-0.99 | -00:00:00.990 | |
8501212 | 850:12:12.000 | |
20001212 | NULL | 長さが範囲外 |
9000000 | NULL | 時間900が上限を超過 |
67 | NULL | 秒67が無効 |
日付型からの変換
Datetimeからの変換
バージョン4.0以降、Datetime型からTime型への変換がサポートされています。
結果は入力の時刻部分であり、この変換は常に有効です。
例
| Input DATETIME | Cast as TIME(4) Result |
|---|---|
2012-02-05 12:12:12.123456 | 12:12:12.1235 |
Timeからの変換
Strictモード
ルール説明
低精度から高精度に変換する場合、新たに現れる小数点以下の桁は0で埋められ、この変換は常に有効です。
高精度から低精度に変換する場合、繰り上がりが発生し、それは前方に継続して伝播する可能性があります。オーバーフローが発生した場合、変換された値は無効になります。
エラー処理
オーバーフローが発生した場合、エラーが報告されます。
例
現在の日付が2025-04-29であると仮定すると:
| Input TIME | Source タイプ | Target タイプ | Result TIME | Comment |
|---|---|---|---|---|
00:00:00.123 | TIME(3) | TIME(6) | 00:00:00.123000 | 精度拡張 |
00:00:00.123456 | TIME(6) | TIME(3) | 00:00:00.123 | 精度縮小、繰り上がりなし |
120:00:00.99666 | TIME(6) | TIME(2) | 120:00:01.00 | 精度縮小、秒に繰り上がり |
838:59:59.999999 | TIME(6) | TIME(5) | Error | 繰り上がりオーバーフロー、無効なTIMEを生成 |
Non-Strictモード
エラー処理を除いて、non-strictモードの動作はstrictモードと完全に一致しています。
ルール説明
低精度から高精度に変換する場合、新たに現れる小数点以下の桁は0で埋められ、この変換は常に有効です。
高精度から低精度に変換する場合、繰り上がりが発生し、それは前方に継続して伝播する可能性があります。オーバーフローが発生した場合、変換された値は無効になります。
エラー処理
オーバーフローが発生した場合、NULLが返されます。
例
| Input TIME | Source タイプ | Target タイプ | Result TIME | Comment |
|---|---|---|---|---|
00:00:00.123 | TIME(3) | TIME(6) | 00:00:00.123000 | 精度拡張 |
00:00:00.123456 | TIME(6) | TIME(3) | 00:00:00.123 | 精度縮小、繰り上がりなし |
120:00:00.99666 | TIME(6) | TIME(2) | 120:00:01.00 | 精度縮小、秒に繰り上がり |
838:59:59.999999 | TIME(6) | TIME(5) | NULL | 繰り上がりオーバーフロー、無効なTIMEを生成 |