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)の場合、Cast の前にその型が表す実際の値をそのまま使用します。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)の場合、Cast の前にその型が表す実際の値を使用します。
入力が負の場合、結果は解析した値の符号を反転した値になります。
エラー処理
規則に従って入力を有効な 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 になる |
TIMESTAMP_NS からの変換
結果は入力の時刻部分になります。TIME(p) は 0~6 の精度 p をサポートするため、Doris は九桁の小数秒を変換先の精度に丸めます。繰り上がりは次の秒に伝わることがあり、23:59:59.999999999 を丸めると 24:00:00 になる場合があります。
有効な TIMESTAMP_NS の時刻部分はすべて TIME の範囲内にあるため、厳格モードでも非厳格モードでも変換は常に成功します。入力が NULL の場合は NULL を返します。
例
| 入力 TIMESTAMP_NS | 変換先の型 | TIME への変換結果 | 説明 |
|---|---|---|---|
2024-02-29 12:34:56.123456789 | TIME(0) | 12:34:56 | 秒単位に丸める |
2024-02-29 12:34:56.123456789 | TIME(3) | 12:34:56.123 | ミリ秒単位に丸める |
2024-02-29 12:34:56.123456789 | TIME(6) | 12:34:56.123457 | マイクロ秒単位に丸める |
1969-12-31 23:59:59.999999999 | TIME(6) | 24:00:00.000000 | 次の秒への繰り上がり |