メインコンテンツまでスキップ

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 Definition

<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>の2つの形式がサポートされています。

  • 最初にオプションのプラス記号またはマイナス記号があり、結果の符号を表します。

  • <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の位が結果の秒の位に対応し、左に向かって順番に埋められます。例えば、入力の千の位が結果の分の10の位に対応します。

    • <microsecond>フィールドと同じオプションの小数部。pを超える桁数はp桁に丸められます。

エラーハンドリング
  • フォーマットエラー:上記のBNFの分岐のいずれにも適合しない場合、即座にエラーが報告されます。

  • ドメインエラー:結果が有効な時刻でない場合、またはTIME型のドメインを超える場合、エラーが報告されます。

StringCast as TIME(6) ResultComment
100:00:01.0000001の位が秒の位に対応
12300:01:23.0000001の位が秒の位に対応、左に拡張
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"

ルール説明

全体構造

2つのフォーマットがサポートされています:<colon-format><numeric-format>

  • 時刻の符号を表すオプションの符号。

  • <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)としてのキャスト結果コメント
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値として解析できない場合、エラーが報告されます。

NumberCast as TIME(3) ResultComment
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長さが範囲外
9000000Error時間900が上限を超過
67Error秒67は無効

Non-strictモード

エラー処理を除き、non-strictモードでの動作はstrictモードと完全に一致します。

ルールの説明

有効な形式

整数桁については、時刻の右端から左に向かって、最下位桁から最上位桁まで数字が埋められます。以下は有効な形式とその対応する埋め込み結果です(マイクロ秒部分を除く):

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が返されます。

NumberCast as TIME(3) ResultComment
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長さが範囲外
9000000NULL時間900が上限を超過
67NULL秒67は無効

Datelike型から

Datetimeから

動作変更

バージョン4.0以降、Datetime型からTime型への変換がサポートされています。

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

Input DATETIMECast as TIME(4) Result
2012-02-05 12:12:12.12345612:12:12.1235

Timeから

Strictモード

ルール記述

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

高精度から低精度に変換する場合、繰り上がりが発生し、それは前方に伝播し続けることができます。オーバーフローが発生した場合、変換された値は無効になります。

エラー処理

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

現在の日付が2025-04-29であるとすると:

Input TIMESource TypeTarget TypeResult TIMEComment
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を生成

Non-Strictモード

エラー処理を除いて、non-strictモードの動作はstrictモードと完全に一致します。

ルール記述

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

高精度から低精度に変換する場合、繰り上がりが発生し、それは前方に伝播し続けることができます。オーバーフローが発生した場合、変換された値は無効になります。

エラー処理

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

Input TIMESource TypeTarget TypeResult TIMEComment
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を生成