TIME 型への変換
TIME 型の有効範囲は [-838:59:59.999999, 838:59:59.999999] です。
TIME 型には小数点以下の桁数を表す型パラメータ p があります。完全な表記は TIME(p) です。たとえば、TIME(6) はマイクロ秒精度に対応する TIME 型を表します。
文字列からの変換
バージョン 4.0 以降、TIME 型の解析でサポートする形式はこの文書に記載されたものだけです。Datetime 型で許容される規則による二次的な変換は行いません。
厳格モード
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"
規則の説明
全体の構造
<colon-format> と <numeric-format> の二つの形式をサポートします。
-
先頭には、結果の符号を表すプラス記号またはマイナス記号を省略可能で指定できます。
-
<colon-format>は、次の要素で構成されます。-
<hour>: 0~23。一桁以上で、INT の範囲を超えてはいけません。 -
<minute>: 0~59。一桁または二桁で、区切り文字:を挟んで<hour>の後に指定します。 -
<second>: 省略可能。0~59。一桁または二桁で、区切り文字:を挟んで<minute>の後に指定します。デフォルト値は 0 です。 -
<microsecond>: 省略可能。.で始まり、その後に任意の桁数の数字が続きます。デフォルト値は 0 です。
-
-
<numeric-format>は、次の要素で構成されます。-
連続する数字列を、時・分・秒の連続したフィールドとして扱います。右詰めで解釈し、入力の一の位を結果の秒の一の位に合わせ、残りの桁を左に向かって順に配置します。たとえば、入力の千の位は結果の分の十の位に対応します。
-
<microsecond>フィールドと同じ形式の小数部を省略可能で指定できます。pを超える桁は小数点以下p桁に丸められます。
-
エラー処理
-
形式エラー: 上記の BNF のいずれの分岐にも一致しない場合、直ちにエラーが報告されます。
-
値域エラー: 結果が有効な時刻でない場合、または TIME 型の値域を超える場合、エラーが報告されます。
例
| 文字列 | 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 | 負の入力 |
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> の二つの形式をサポートします。
-
時刻の符号を表す符号を省略可能で指定できます。
-
<colon-format>は、次の要素で構成されます。-
<hour>: 0~23。一桁以上で、INT の範囲を超えてはいけません。 -
<minute>: 0~59。一桁または二桁で、:で区切ります。 -
<second>: 省略可能。0~59。一桁または二桁で、:で区切ります。 -
<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)の場合、キャスト前の実際の値を直接使用します。p 桁を超える数字は、小数点以下 p 桁に丸められます。
入力が負の場合、結果は解析した値の符号を反転したものになります。
エラー処理
規則に従って入力を有効な TIME 値として解析できない場合は、エラーが報告されます。
例
| 数値 | TIME(3) へのキャスト結果 | 説明 |
|---|---|---|
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 | 桁数が範囲外 |
9000000 | Error | 900 時間は上限を超える |
67 | Error | 67 秒は無効 |
非厳格モード
エラー処理を除き、非厳格モードの動作は厳格モードと完全に同じです。
規則の説明
有効な形式
整数部の数字は、時刻の右端から左に向かって、下位桁から上位桁へ順に配置します。以下に有効な形式と、その配置結果を示します(マイクロ秒部分は除きます)。
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)の場合、キャスト前にその型が表す実際の値を使用します。
入力が負の場合、結果は解析した値の符号を反転したものになります。
エラー処理
規則に従って入力を有効な TIME 値として解析できない場合は、NULL を返します。
例
| 数値 | TIME(3) へのキャスト結果 | 説明 |
|---|---|---|
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 型への変換がサポートされます。
結果は入力の時刻部分です。この変換は常に有効です。
例
| 入力 DATETIME | TIME(4) へのキャスト結果 |
|---|---|
2012-02-05 12:12:12.123456 | 12:12:12.1235 |
Time からの変換
厳格モード
規則の説明
低い精度から高い精度に変換する場合、新たに増える小数桁は 0 で埋められます。この変換は常に有効です。
高い精度から低い精度に変換する場合は桁上がりが発生することがあり、さらに上位の桁へ伝播する場合があります。オーバーフローが発生した場合、変換後の値は無効です。
エラー処理
オーバーフローが発生した場合は、エラーが報告されます。
例
現在の日付を 2025-04-29 と仮定します。
| 入力 TIME | 変換元の型 | 変換先の型 | TIME の結果 | 説明 |
|---|---|---|---|---|
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 値が無効になる |
非厳格モード
エラー処理を除き、非厳格モードの動作は厳格モードと完全に同じです。
規則の説明
低い精度から高い精度に変換する場合、新たに増える小数桁は 0 で埋められます。この変換は常に有効です。
高い精度から低い精度に変換する場合は桁上がりが発生することがあり、さらに上位の桁へ伝播する場合があります。オーバーフローが発生した場合、変換後の値は無効です。
エラー処理
オーバーフローが発生した場合は、NULL を返します。
例
| 入力 TIME | 変換元の型 | 変換先の型 | TIME の結果 | 説明 |
|---|---|---|---|---|
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 値が無効になる |