メインコンテンツまでスキップ
に最終更新

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) への変換結果説明
100:00:01.000000一の位を秒の一の位に合わせる
12300:01:23.000000一の位を秒の一の位に合わせ、左に向かって埋める
2005959.12200:59:59.120000小数部を含む入力
0.1200:00:00.120000数値形式の 0 時刻入力と小数部
00:00:00.1200:00:00.120000コロン区切り形式の 0 時刻入力と小数部
123.00:01:23.000000小数部の数字は 0 桁でもよい
123.000:01:23.000000小数部が 1 桁の 0
123.12300:01:23.123000有効な小数部
-1-00:00:01.000000負の入力
12-34:56.1Error (format error)'-' は有効な区切り文字ではない
12 : 34 : 56Error (format error)無効な空白文字
76Error (domain error)76 秒は無効
200595912Error (domain error)20059 時間は無効
8385959.9999999Error (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) への変換結果説明
100:00:01.000000最も右の桁を秒に合わせる
12300:01:23.000000最も右の桁を秒に合わせ、右から左へ埋める
2005959.12200:59:59.120000小数部を含む入力
0.1200:00:00.120000数値形式の 0 時刻入力と小数部
00:00:00.1200:00:00.120000コロン区切り形式の 0 時刻入力と小数部
123.00:01:23.000000小数部の数字は 0 桁でもよい
123.000:01:23.000000小数部が 1 桁の 0
123.12300:01:23.123000有効な小数部
-1-00:00:01.000000負の入力
-800:05:05-800:05:05.0000003 桁の時間、負の値
-991213.56-99:12:13.560000負の入力
80302.999999908:03:03.000000小数部が 6 桁を超え、秒に繰り上がる
5656.300000000900:56:56.300000小数部の下位桁が切り捨てられる
5656.300000700100:56:56.300001マイクロ秒に丸められる
1 NULL無効な形式。BNF が空白文字と一致しない
.123NULL小数点の前にフィールドがない
:12:34NULL時間がない
12-34:56.1NULL'-' は有効な区切り文字ではない
12 : 34 : 56NULL無効な空白文字
76NULL76 秒は無効
200595912NULL20059 時間は無効
8385959.9999999NULL繰り上がりによって上限を超える

数値からの変換​

すべての数値型を 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) への変換結果説明
12345612:34:56.000
-123456-12:34:56.000
12300:01:23.000
6.9999900:00:07.000
-0.99-00:00:00.990
8501212850:12:12.000
20001212Error桁数が範囲外
9000000Error900 時間は上限を超える
67Error67 秒は無効

非厳格モード​

エラー処理を除き、非厳格モードの動作は厳格モードと完全に同じです。

規則の説明​

有効な形式​

整数部の数字は、時刻の右端から左に向かって、下位桁から上位桁へ埋められます。以下に有効な形式と、それぞれの埋め方の結果を示します(マイクロ秒部分を除く)。

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) への変換結果説明
12345612:34:56.000
-123456-12:34:56.000
12300:01:23.000
6.9999900:00:07.000
-0.99-00:00:00.990
8501212850:12:12.000
20001212NULL桁数が範囲外
9000000NULL900 時間は上限を超える
67NULL67 秒は無効

日付・時刻型からの変換​

Datetime からの変換​

動作の変更

バージョン 4.0 以降、Datetime 型から Time 型への変換をサポートします。

結果は入力の時刻部分になり、この変換は常に有効です。

例​

入力 DATETIMETIME(4) への変換結果
2012-02-05 12:12:12.12345612:12:12.1235

Time からの変換​

厳格モード​

規則の説明​

低精度から高精度に変換する場合、新たに増える小数桁は 0 で埋められ、この変換は常に有効です。

高精度から低精度に変換する場合、繰り上がりが発生し、それがさらに上位の桁へ伝わることがあります。オーバーフローが発生すると、変換後の値は無効です。

エラー処理​

オーバーフローが発生した場合、エラーが報告されます。

例​

現在の日付を 2025-04-29 と仮定します。

入力 TIME変換元の型変換先の型結果の TIME説明
00:00:00.123TIME(3)TIME(6)00:00:00.123000精度の拡張
00:00:00.123456TIME(6)TIME(3)00:00:00.123精度の縮小、繰り上がりなし
120:00:00.99666TIME(6)TIME(2)120:00:01.00精度の縮小、秒への繰り上がり
838:59:59.999999TIME(6)TIME(5)Error繰り上がりによるオーバーフローで、無効な TIME になる

非厳格モード​

エラー処理を除き、非厳格モードの動作は厳格モードと完全に同じです。

規則の説明​

低精度から高精度に変換する場合、新たに増える小数桁は 0 で埋められ、この変換は常に有効です。

高精度から低精度に変換する場合、繰り上がりが発生し、それがさらに上位の桁へ伝わることがあります。オーバーフローが発生すると、変換後の値は無効です。

エラー処理​

オーバーフローが発生した場合、NULL を返します。

例​
入力 TIME変換元の型変換先の型結果の TIME説明
00:00:00.123TIME(3)TIME(6)00:00:00.123000精度の拡張
00:00:00.123456TIME(6)TIME(3)00:00:00.123精度の縮小、繰り上がりなし
120:00:00.99666TIME(6)TIME(2)120:00:01.00精度の縮小、秒への繰り上がり
838:59:59.999999TIME(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.123456789TIME(0)12:34:56秒単位に丸める
2024-02-29 12:34:56.123456789TIME(3)12:34:56.123ミリ秒単位に丸める
2024-02-29 12:34:56.123456789TIME(6)12:34:56.123457マイクロ秒単位に丸める
1969-12-31 23:59:59.999999999TIME(6)24:00:00.000000次の秒への繰り上がり