メインコンテンツまでスキップ
バージョン: 26.x

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型のドメインを超える場合、エラーが報告されます。

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)繰り上がりが上限を超過

非厳密モード

Behavior Change

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)変換結果コメント
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小数点以下の桁数に丸められます。

入力が負の場合、結果は符号を反転した解析値になります。

Error Handling

ルールに従って入力が有効なTIME値として解析できない場合、エラーが報告されます。

Examples

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
20001212ErrorLength out of range
9000000ErrorHour 900 exceeds upper limit
67ErrorSecond 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が返されます。

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が無効

日付型からの変換

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 タイプTarget タイプResult 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 タイプTarget タイプResult 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を生成