このページでは、値ドメインに関する情報を含め、Google 標準 SQL のすべてのデータ型の概要を説明します。データ型のリテラルおよびコンストラクタの詳細については、語彙構造と構文をご覧ください。
データ型の特性
クエリデータを保存する場合、以下のデータ型のプロパティを覚えておくと役に立ちます。
null 可能なデータ型
null 可能なデータ型の場合、NULL
は有効な値です。現在、既存のデータ型はすべて null 可能ですが、ARRAY には条件が適用されます。
順序付け可能なデータ型
順序付け可能なデータ型の式は、ORDER BY
句で使用できます。以下を除くすべてのデータ型に適用されます。
ARRAY
STRUCT
GEOGRAPHY
JSON
NULL の順序
ORDER BY
句のコンテキストでは、NULL
がとり得る最小値になります。つまり、ASC
の並べ替えでは NULL
が最初になり、DESC
の並べ替えでは最後になります。
NULLS FIRST
または NULLS LAST
修飾子を使用することで、ASC
や DESC
に関係なく、列の最初や最後の値として NULL
値を指定できます。
ASC
、DESC
、NULLS FIRST
、NULLS LAST
の使用の詳細については、ORDER BY
句をご覧ください。
浮動小数点値の順序
浮動小数点の値は小さい値から大きい値の順に並べ替えられます。
NULL
NaN
- 並べ替えるときにすべてのNaN
値は同じものとみなされます。-inf
- 負の数
- 0 または -0 - 並べ替えるときにすべてのゼロ値は同じものとみなされます。
- 正の数
+inf
グループ化可能なデータ型
グループ化可能なデータ型は通常、GROUP BY
、DISTINCT
、PARTITION BY
に続く式で使用されます。ただし、PARTITION BY
式に浮動小数点型を含めることはできません。以下を除くすべてのデータ型がサポートされています。
GEOGRAPHY
JSON
ARRAY
STRUCT
特定の浮動小数点の値は、GROUP BY
句を使ったグループ分けと DISTINCT
キーワードでのグループ分けの両方を含め、次のようにグループ分けできます。
NULL
NaN
- グループ分けするときにすべてのNaN
値は同じものとみなされます。-inf
- 0 または -0 - グループ分けするときにすべてのゼロ値は同じものとみなされます。
+inf
比較可能なデータ型
同じ比較可能なデータ型の値は、互いに比較できます。以下を除くすべてのデータ型がサポートされています。
GEOGRAPHY
JSON
注:
STRUCT
の等価性比較はフィールド順にフィールドごとにサポートされています。フィールド名は無視されます。比較値よりも小さい値と大きい値はサポートされません。GEOGRAPHY
値を比較するには、ST_Equals を使用します。- 比較をサポートするすべての型が
JOIN
条件で使用されます。結合条件の説明については、JOIN 型をご覧ください。
照合可能なデータ型
照合可能なデータ型では、文字列の並べ替えや比較の方法を決定する照合がサポートされています。次のデータ型が照合をサポートしています。
STRING
STRUCT
のSTRING
フィールドARRAY
内のSTRING
要素
列の値の最大値は 10MiB で、スカラー型と配列型に適用されます。
パラメータ化されたデータ型
構文:
DATA_TYPE(param[, ...])
パラメータを使用して、次のデータ型の制約を指定できます。
STRING
BYTES
NUMERIC
BIGNUMERIC
パラメータで宣言されたデータ型は、パラメータ化されたデータ型と呼ばれます。パラメータ化されたデータ型は、列とスクリプト変数でのみ使用できます。パラメータ化されたデータ型を含む列はパラメータ化された列になり、パラメータ化されたデータ型のスクリプト変数はパラメータ化されたスクリプト変数になります。パラメータ化された型制約は、パラメータ化された列に値を書き込むとき、またはパラメータ化されたスクリプト変数に値を割り当てるときに適用されます。
データ型のパラメータは式に渡されず、データ型だけが渡されます。
例
-- Declare a variable with type parameters.
DECLARE x STRING(10);
-- This is a valid assignment to x.
SET x = "hello";
-- This assignment to x violates the type parameter constraint and results in an OUT_OF_RANGE error.
SET x = "this string is too long"
-- Declare variables with type parameters.
DECLARE x NUMERIC(10) DEFAULT 12345;
DECLARE y NUMERIC(5, 2) DEFAULT 123.45;
-- The variable x is treated as a NUMERIC value when read, so the result of this query
-- is a NUMERIC without type parameters.
SELECT x;
-- Type parameters are not propagated within expressions, so variables x and y are treated
-- as NUMERIC values when read and the result of this query is a NUMERIC without type parameters.
SELECT x + y;
配列型
名前 | 説明 |
---|---|
ARRAY |
ARRAY 型ではないゼロ以上の要素の順序付きリスト。 |
ARRAY は、ARRAY 型ではない値のゼロ以上の要素の順序付きリストです。ARRAY 内の要素は同じ型でなければなりません。
ARRAY からなる ARRAY は許可されません。ARRAY からなる ARRAY を生成するクエリはエラーを返します。そのような場合は、SELECT AS STRUCT
コンストラクトを使用して ARRAY の間に STRUCT を挿入する必要があります。
NULL と ARRAY 型
現在、BigQuery には、NULL
と ARRAY に関する次のルールがあります。
ARRAY には
NULL
を指定できます。例:
SELECT CAST(NULL AS ARRAY<INT64>) IS NULL AS array_is_null; +---------------+ | array_is_null | +---------------+ | TRUE | +---------------+
クエリ内では
NULL
と空の ARRAY は 2 つの別個の値ですが、BigQuery はクエリ結果でNULL
ARRAY を空の ARRAY に変換します。例:
WITH Items AS ( SELECT [] AS numbers UNION ALL SELECT CAST(NULL AS ARRAY<INT64>)) SELECT numbers FROM Items; +---------+ | numbers | +---------+ | [] | | [] | +---------+
NULL
要素を含む ARRAY はクエリ内で使用できますが、そのような ARRAY がクエリ結果にあると、BigQuery でエラーが発生します。たとえば、次のようになります。
SELECT FORMAT("%T", [1, NULL, 3]) as numbers; +--------------+ | numbers | +--------------+ | [1, NULL, 3] | +--------------+
ただし、次のエラーが発生します。
-- error SELECT [1, NULL, 3] as numbers;
ARRAY 型の宣言
ARRAY<T>
ARRAY 型は山括弧(<
と >
)を使用して宣言されます。ARRAY 要素のデータ型は任意のコンプレックスにすることができますが、ARRAY に直接別の ARRAY を含めることはできません。
例
型の宣言 | 意味 |
---|---|
ARRAY<INT64>
|
64 ビット整数のシンプルな ARRAY。 |
ARRAY<BYTES(5)>
|
パラメータ化されたバイトのシンプルな ARRAY。 |
ARRAY<STRUCT<INT64, INT64>>
|
STRUCT からなる ARRAY。各 STRUCT には 64 ビット整数が 2 つ含まれます。 |
ARRAY<ARRAY<INT64>>
(サポート対象外) |
これは無効な型の宣言です。マルチレベル ARRAY の作成方法を調べるためにこのページにアクセスした場合に備え、ここに記載しておきます。ARRAY には直接 ARRAY を含めることはできません。代わりに次の例をご覧ください。 |
ARRAY<STRUCT<ARRAY<INT64>>>
|
64 ビット整数の ARRAY からなる ARRAY。ARRAY には直接他の ARRAY を含めることができないため、2 つの ARRAY の間に STRUCT が挿入されています。 |
ARRAY の作成
配列リテラルまたは配列関数を使用して ARRAY を作成できます。手順については、配列の操作をご覧ください。
ブール型
名前 | 説明 |
---|---|
BOOL |
ブール値はキーワード TRUE と FALSE (大文字と小文字の区別なし)で表されます。 |
ブール値は、小さい値から大きい値に並べ替えられます。
NULL
FALSE
TRUE
バイト型
名前 | 説明 |
---|---|
BYTES |
可変長文字バイナリデータ。 |
STRING と BYTES は入れ替えて使用できない別々の型です。STRING を操作する大半の関数は BYTES に対しても定義されています。BYTES バージョンは Unicode 文字ではなく RAW バイトを操作します。STRING と BYTES の間でキャスティングを行うと、強制的に UTF-8 を使用してバイトがエンコードされます。
パラメータ化されたバイト型
パラメータ化された型 | 説明 |
---|---|
BYTES(L) |
バイナリ文字列で許容される最大 L バイトのバイト シーケンス。L は正の INT64 値です。バイト シーケンスが L バイトを超えると、OUT_OF_RANGE エラーが発生します。 |
パラメータ化された型の詳細と使用できる場所については、パラメータ化されたデータ型をご覧ください。
日付型
名前 | 範囲 |
---|---|
DATE |
0001-01-01~9999-12-31 |
DATE 型は、タイムゾーンに関係なく、論理カレンダー日を表します。DATE 型の値は特定の 24 時間の期間を表していません。所定の DATE 値は、解釈されるタイムゾーンによって異なる 24 時間の期間を表します。また、夏時間の移行期には 1 日が通常よりも短くなったり、長くなったりする場合があります。絶対的な時刻を表すには、タイムスタンプを使用します。
正規形式
'YYYY-[M]M-[D]D'
YYYY
: 4 桁の年[M]M
: 1 桁または 2 桁の月[D]D
: 1 桁または 2 桁の日
日時型
名前 | 範囲 |
---|---|
DATETIME |
0001-01-01 00:00:00~9999-12-31 23:59:59.999999 |
DATETIME 値は、タイムゾーンに依存せずに時計に表示される日時を表します。これには年、月、日、時、分、秒、サブ秒が含まれます。絶対的な時刻を表すには、タイムスタンプを使用します。
正規形式
YYYY-[M]M-[D]D[( |T)[H]H:[M]M:[S]S[.F]]
YYYY
: 4 桁の年[M]M
: 1 桁または 2 桁の月[D]D
: 1 桁または 2 桁の日( |T)
: スペースまたはT
区切り文字[H]H
: 1 桁または 2 桁の時(有効な値は 00~23)[M]M
: 1 桁または 2 桁の分(有効な値は 00~59)[S]S
: 1 桁または 2 桁の秒(有効な値は 00~59)[.F]
: 最大で小数第 6 位まで(マイクロ秒の精度)
地理型
名前 | 説明 |
---|---|
GEOGRAPHY |
ポイントセットまたは地球表面のサブセットとして表されるポイント、ライン、およびポリゴンのコレクション。 |
GEOGRAPHY
型は、OGC Simple Features 仕様(SFS)に基づいており、次のオブジェクトのコレクションです。
- Point geography: 座標空間内の単一の場所。ポイントには x 座標値と y 座標値があり、x 座標は WGS84 基準楕円体上のポイントの経度、y 座標は緯度です。
- Linestring geography : 一連のポイントと測地エッジが間にある 1 次元の幾何学的オブジェクト。
- Polygon geography: 1 個の外部境界と 0 個以上の内部境界で定義される平面表面。それぞれの内部境界でポリゴンの穴が定義されます。ポリゴンの境界ループは、境界頂点を順番にトラバースするとポリゴンの内部が左側になる向きです。
GEOGRAPHY
値のポイント、LineString、ポリゴンは、WGS84 基準楕円体上の単純な配列を形成します。単純配列は、WGS84 表面上のポイントがコレクションの複数の要素に含まれない配列です。自己交差が存在している場合、自動的に削除されます。
ポイント、LineString、ポリゴンを含まない GEOGRAPHY
は、空の GEOGRAPHY
と呼ばれます。
GEOGRAPHY
は、地理関数の結果または引数です。
間隔型
名前 | 範囲 |
---|---|
INTERVAL |
-10000-0 -3660000 -87840000:0:0~10000-0 3660000 87840000:0:0 |
INTERVAL オブジェクトは期間を表します。間隔は、次の 3 つの独立した部分から構成されます。
[sign]Y-M
: 年と月[sign]D
: 日[sign]H:M:S.F
: 時間、分、秒、サブ秒
正規形式
[sign]Y-M [sign]D [sign]H:M:S[.F]
Y
: 年M
: 月D
: 日H
: 時間M
: 分S
: 秒[.F]
: 最大で小数第 6 位まで(マイクロ秒の精度)
JSON 型
名前 | 説明 |
---|---|
JSON |
軽量のデータ交換形式である JSON を表します。 |
JSON
型の値が作成される場合は、次の正規化動作が想定されます。
- ブール値、文字列、NULL は正確に保持されます。
- 空白文字は保持されません。
- JSON 値は、-9,223,372,036,854,775,808(64 ビット整数の最小値)から 18,446,744,073,709,551,615(64 ビット整数の符号のない最大値)の範囲の整数と、
FLOAT64
のドメイン内の浮動小数点を格納できます。 - 配列内の要素の順序は、正確に保持されます。
- オブジェクトのメンバーの順序は保証も保持もされません。
- オブジェクトに重複するキーがある場合は、最初に見つかったキーが保持されます。
- 最大 500 レベルまでネストできます。
- JSON 数値の元の文字列表現の形式は、保持できません。
数値型
数値型には次の種類があります。
INT64
(エイリアス:INT
、SMALLINT
、INTEGER
、BIGINT
、TINYINT
、BYTEINT
)NUMERIC
(エイリアス:DECIMAL
)BIGNUMERIC
(エイリアス:BIGDECIMAL
)FLOAT64
整数型
整数は小数部分を持たない数値です。
名前 | 範囲 |
---|---|
INT64
INT
SMALLINT
INTEGER
BIGINT
TINYINT
BYTEINT
|
-9,223,372,036,854,775,808~9,223,372,036,854,775,807 |
INT
、SMALLINT
、INTEGER
、BIGINT
、TINYINT
、BYTEINT
は INT64
のエイリアスです。
小数型
小数型の値は、固定の小数点以下の精度とスケールを持つ数値です。精度は、数値に含まれる桁数です。スケールは小数点以下の桁数です。
この型は、小数部分を正確に表すことができ、財務計算に適しています。
名前 | 精度、スケール、範囲 |
---|---|
NUMERIC
DECIMAL |
精度: 38 スケール: 9 最小: -9.9999999999999999999999999999999999999E+28 最大: 9.9999999999999999999999999999999999999E+28 |
BIGNUMERIC
BIGDECIMAL |
精度: 76.76(77 桁目は一部) スケール: 38 最小: -5.7896044618658097711785492504343953926634992332820282019728792003956564819968E+38 最大: 5.7896044618658097711785492504343953926634992332820282019728792003956564819967E+38 |
DECIMAL
は NUMERIC
のエイリアスです。BIGDECIMAL
は BIGNUMERIC
のエイリアスです。
パラメータ化された小数型
パラメータ化された型 | 説明 |
---|---|
NUMERIC(P[,S])
DECIMAL(P[,S]) |
最大精度が P、最大スケールが S の NUMERIC または DECIMAL 型。P と S の型は INT64 になります。指定しない場合、S は 0 と解釈されます。最大スケール範囲: 0 ≤ S ≤ 9 最大精度範囲: max(1, S) ≤ P ≤ S + 29 |
BIGNUMERIC(P[, S])
BIGDECIMAL(P[, S]) |
最大精度が P、最大スケールが S の BIGNUMERIC または BIGDECIMAL 型。P と S の型は INT64 になります。指定しない場合、S は 0 と解釈されます。最大スケール範囲: 0 ≤ S ≤ 38 最大精度範囲: max(1, S) ≤ P ≤ S + 38 |
値が S の小数桁を超える場合、S の小数桁に丸められます。たとえば、NUMERIC(5, 2)列に値 1.125 を挿入すると、1.125 は四捨五入され、1.13 になります。
値が P の桁を超える場合、OUT_OF_RANGE
エラーが発生します。たとえば、NUMERIC(5, 2)列に 1111 を挿入すると、1111 は NUMERIC(5, 2)列の最大許容値である 999.99 より大きいため、OUT_OF_RANGE
エラーが返されます。
パラメータ化された型の詳細と使用できる場所については、パラメータ化されたデータ型をご覧ください。
浮動小数点型
浮動小数点の値は小数部分のある近似値です。
名前 | 説明 |
---|---|
FLOAT64 |
倍精度(近似)数値。 |
浮動小数点セマンティクス
浮動小数点を扱う場合、NaN
と +/-inf
という考慮しなければならない特別な非数値があります。
算術演算子は、有限出力を出すすべての有限入力値と、少なくとも 1 つの入力が非定形であるすべてのオペレーションに対し、標準 IEEE-754 動作を行えるようにします。
入力が有限値であっても出力が非定形の場合、関数呼び出しと演算子によってオーバーフロー エラーが返されます。入力に非定形値が含まれる場合、出力が非定形になる可能性があります。一般的な関数では NaN
または +/-inf
が使用されません。しかし、IEEE_DIVIDE
のような特定の関数は有限入力に対し非定形値を返すことがあります。このような場合はすべて、数学的関数で明示的に表されます。
浮動小数点値は近似値です。
- 浮動小数点値を表すバイナリ形式では、値の範囲で最大の正の値と最小の負の数の間の数値サブセットのみを表現できます。これにより、他の方法よりもはるかに広い範囲を効率的に処理できます。正確に表現できない数値は、近似値を使用して表します。たとえば、
0.1
は2
の累乗でスケーリングされる整数として表現することはできません。この値を文字列として表す場合は、指定した桁数に丸められます。0.1
に近い値が"0.1"
と表される場合があり、正確な値でないことがわからないことがあります。それ以外の場合は、近似値が表示されます。 - 浮動小数点値を合計すると、精度に制限があるため、予期しない結果になることがあります。たとえば、
(1e30 + 1e-20) - 1e30 = 0
、(1e30 - 1e30) + 1e-20 = 1e-20
のようになります。これは、浮動小数点値では(1e30 + 1e-20)
を表すのに十分な精度がないため、結果が1e30
に丸められるためです。この例では、浮動小数点値のSUM
集計関数の結果が、値が累積された順序によって変わることも示しています。通常、この順序は確定的ではないため、結果も確定的ではありません。したがって、浮動小数点値の結果のSUM
は確定的ではなく、同じテーブルに対して同じクエリを 2 回実行すると異なる結果になることがあります。 - 上記の点について問題がある場合は、固定小数点型を使用してください。
数学的関数の例
左の用語 | 演算子 | 右の用語 | 戻り値 |
---|---|---|---|
任意値 | + |
NaN |
NaN |
1.0 | + |
+inf |
+inf |
1.0 | + |
-inf |
-inf |
-inf |
+ |
+inf |
NaN |
FLOAT64 の最大値 |
+ |
FLOAT64 の最大値 |
オーバーフロー エラー |
最小 FLOAT64 値 |
/ |
2.0 | 0.0 |
1.0 | / |
0.0 |
「ゼロ除算」エラー |
比較演算子は浮動小数点入力に対し、標準 IEEE-754 動作を行えるようにします。
比較演算子の例
左の用語 | 演算子 | 右の用語 | 戻り値 |
---|---|---|---|
NaN |
= |
任意値 | FALSE |
NaN |
< |
任意値 | FALSE |
任意値 | < |
NaN |
FALSE |
-0.0 | = |
0.0 | TRUE |
-0.0 | < |
0.0 | FALSE |
比較できるようにするために、これらの値の順序付けとグループ化の詳細については、浮動小数点値の順序をご覧ください。
文字列型
名前 | 説明 |
---|---|
STRING |
可変長文字(Unicode)データ。 |
入力 STRING 値は UTF-8 エンコードに変換する必要があります。また、出力 STRING 値は UTF-8 エンコードに変換されます。CESU-8 や修正 UTF-8 などの代替エンコーディングは有効な UTF-8 として扱われません。
STRING 値を操作するすべての関数と演算子は、バイトではなく Unicode 文字を処理します。たとえば、STRING 型の入力値に適用される SUBSTR
や LENGTH
のような関数は、バイトではなく文字数をカウントします。
各 Unicode 文字には、コードポイントと呼ばれる数値が割り当てられます。下位のコードポイントは下位の文字に割り当てられます。文字が比較されるとき、コードポイントは他の文字より小さい文字か大きい文字かを判断します。
STRING を操作する大半の関数は BYTES に対しても定義されています。BYTES バージョンは Unicode 文字ではなく RAW バイトを操作します。STRING と BYTES は入れ替えて使用できない別々の型です。いずれの方向にも暗黙的にキャスティングされません。STRING と BYTES との明示的なキャスティングでは UTF-8 エンコーディングとデコーディングが行われます。バイトが有効な UTF-8 ではない場合、BYTES から STRING へのキャスティングではエラーが返されます。
パラメータ化された文字列型
パラメータ化された型 | 説明 |
---|---|
STRING(L) |
文字列の最大文字数は L です。ここで、L は正の INT64 値です。L を超える Unicode 文字の文字列が割り当てられると、OUT_OF_RANGE エラーが発生します。 |
パラメータ化された型の詳細と使用できる場所については、パラメータ化されたデータ型をご覧ください。
構造体型
名前 | 説明 |
---|---|
STRUCT |
順序付きフィールドのコンテナ。各フィールドはデータ型(必須)とフィールド名(オプション)を持ちます。 |
STRUCT 型の宣言
STRUCT<T>
STRUCT 型は山括弧(<
と >
)を使用して宣言されます。STRUCT 要素のデータ型は任意のコンプレックスにすることができます。
例
型の宣言 | 意味 |
---|---|
STRUCT<INT64>
|
単一の名前の付いていない 64 ビット整数フィールドを持つシンプルな STRUCT。 |
STRUCT<x STRING(10)>
|
単一のパラメータ化された文字列フィールドを持つ x というシンプルな STRUCT。 |
STRUCT<x STRUCT<y INT64, z INT64>>
|
x という名前のネストされた STRUCT を内部に持つ STRUCT。この STRUCT x には y と z という 2 つのフィールドがあり、その両方が 64 ビット整数です。 |
STRUCT<inner_array ARRAY<INT64>>
|
64 ビット整数要素を持つ inner_array という名前の ARRAY が含まれる STRUCT。 |
STRUCT の構成
タプル構文
(expr1, expr2 [, ... ])
出力データ型は、入力式のデータ型と一致する型の匿名フィールドのある匿名 STRUCT データ型です。少なくとも 2 つの指定された式が必要です。式がないと、構文は括弧で括られた式と区別できません。
例
構文 | 出力データ型 | 注 |
---|---|---|
(x, x+y) |
STRUCT<?,?> |
列名が使われている場合(文字列が引用されていない場合)、STRUCT フィールドのデータ型は列のデータ型から導出されます。x と y は列であるため、STRUCT フィールドのデータ型は列の型と追加演算子の出力データ型から導出されます。 |
WHERE
句などのマルチパート キーを使った比較式では、この構文を使用して STRUCT を比較することもできます。
WHERE (Key1,Key2) IN ( (12,34), (56,78) )
型のない STRUCT 構文
STRUCT( expr1 [AS field_name] [, ... ])
重複するフィールド名は許可されます。名前のないフィールドは匿名フィールドとみなされ、名前では参照できません。STRUCT の値は NULL
か NULL
フィールド値になります。
例
構文 | 出力データ型 |
---|---|
STRUCT(1,2,3) |
STRUCT<int64,int64,int64> |
STRUCT() |
STRUCT<> |
STRUCT('abc') |
STRUCT<string> |
STRUCT(1, t.str_col) |
STRUCT<int64, str_col string> |
STRUCT(1 AS a, 'abc' AS b) |
STRUCT<a int64, b string> |
STRUCT(str_col AS abc) |
STRUCT<abc string> |
型のある STRUCT 構文
STRUCT<[field_name] field_type, ...>( expr1 [, ... ])
型のある構文で、明示的な STRUCT データ型を持つ STRUCT を構成できます。出力データ型は、指定された field_type
と正確に同じものになります。2 つの型が同じではない場合、入力式は強制的に field_type
となります。その 2 つの型に互換性がない場合はエラーとなります。AS alias
は入力式で許可されません。式の数は型のフィールド数と一致しなければなりません。また、式のデータ型はフィールドのデータ型に従うように、強制的に変換できるか、リテラルを強制的に変換できる必要があります。
例
構文 | 出力データ型 |
---|---|
STRUCT<int64>(5) |
STRUCT<int64> |
STRUCT<date>("2011-05-05") |
STRUCT<date> |
STRUCT<x int64, y string>(1, t.str_col) |
STRUCT<x int64, y string> |
STRUCT<int64>(int_col) |
STRUCT<int64> |
STRUCT<x int64>(5 AS x) |
エラー - 型のある構文では AS を使用できません。 |
STRUCT の制限付き比較
次の等価演算子を使用して、STRUCT 同士を直接比較できます。
- 等号(
=
) - 不等号(
!=
または<>
) - [
NOT
]IN
直接等価性比較では、フィールド名を無視して、元の順序で STRUCT のフィールドのペアを比較することにご注意ください。STRUCT 内で同じ名前のフィールドを比較する場合は、個々のフィールドを直接比較できます。
時刻型
名前 | 範囲 |
---|---|
TIME |
00:00:00 から 23:59:59.999999 |
TIME 値は、特定の日付やタイムゾーンとは関係なく、時計に表示される時刻を表します。絶対的な時刻を表すには、タイムスタンプを使用します。
正規形式
[H]H:[M]M:[S]S[.DDDDDD|.F]
[H]H
: 1 桁または 2 桁の時(有効な値は 00~23)[M]M
: 1 桁または 2 桁の分(有効な値は 00~59)[S]S
: 1 桁または 2 桁の秒(有効な値は 00~59)[.F]
: 最大で小数第 6 位まで(マイクロ秒の精度)
タイムスタンプ型
名前 | 範囲 |
---|---|
TIMESTAMP |
0001-01-01 00:00:00~9999-12-31 23:59:59.999999 UTC |
TIMESTAMP 値は、タイムゾーンや夏時間などの慣習に関係なく、マイクロ秒精度の絶対的な時刻を表します。
TIMESTAMP は通常、固定された初期時点から経過したマイクロ秒数として内部的に表されます。
TIMESTAMP 自体にはタイムゾーンがありません。これはグローバルに同一の時刻を表します。ただし、人が読める形式のタイムスタンプの表示には、通常、実装に依存する形式で日付、時刻、タイムゾーンが含まれます。たとえば、表示される値「2020-01-01 00:00:00 UTC」、「2019-12-31 19:00:00 America/New_York」、「2020-01-01 05:30:00 Asia/Kolkata」はすべて同じ時刻を表すため、同じ TIMESTAMP 値を表します。
- カレンダーに表示される日付(常用日)を表すには、DATE 値を使用します。
- 時計に表示される時刻(常用時)を表すには、TIME 値を使用します。
- 時計に表示される日付と時刻を表すには、DATETIME 値を使用します。
TIMESTAMP リテラルの正規形式
TIMESTAMP リテラルの正規形式は、次の部分で構成されます。
civil_date_time [time_zone]
civil_date_time:
YYYY-[M]M-[D]D[( |T)[H]H:[M]M:[S]S[.F]]
YYYY
: 4 桁の年[M]M
: 1 桁または 2 桁の月[D]D
: 1 桁または 2 桁の日( |T)
: スペースまたはT
区切り文字[H]H
: 1 桁または 2 桁の時(有効な値は 00~23)[M]M
: 1 桁または 2 桁の分(有効な値は 00~59)[S]S
: 1 桁または 2 桁の秒(有効な値は 00~59)[.F]
: 最大で小数第 6 位まで(マイクロ秒の精度)[time_zone]
: タイムゾーンを表す文字列。タイムゾーンが明示的に指定されていない場合は、デフォルトのタイムゾーンである UTC が使用されます。詳しくは、タイムゾーンのセクションをご覧ください。
タイムゾーン
タイムゾーンは、カレンダーや時計に表示される常用日時からタイムスタンプ(絶対時間)へ、またはその逆に変換されるときに使用されます。これには、「2020-01-01 00:00:00」のような常用日時を含む文字列を解析し、タイムスタンプに変換するオペレーションが含まれます。結果のタイムスタンプ値自体は、グローバルに 1 つの時刻を表しているため、タイムスタンプ自体には特定のタイムゾーンは保存されません。
タイムゾーンは、次の正規形式のいずれかで、文字列によって示されます。
- 協定世界時(UTC)からのオフセット、または UTC を表す文字
Z
- tz database からのタイムゾーン名
America/Los_Angeles
のタイムゾーン オフセットが指定日時の -08
であるため、次のタイムスタンプは同一です。
SELECT UNIX_MILLIS(TIMESTAMP '2008-12-25 15:30:00 America/Los_Angeles') AS millis;
SELECT UNIX_MILLIS(TIMESTAMP '2008-12-25 15:30:00-08:00') AS millis;
協定世界時(UTC)からのオフセット
(+|-)H[H][:M[M]]
Z
例
-08:00
-8:15
+3:00
+07:30
-7
Z
この形式を使用する場合、タイムゾーンと残りのタイムスタンプの間にスペースは使用できません。
2014-09-27 12:30:00.45-8:00
2014-09-27T12:30:00.45Z
タイムゾーン名
continent/[region/]city
タイムゾーン名は tz database から取得されます。あまり包括的ではありませんが簡潔な資料としては、Wikipedia の tz database のタイムゾーン一覧(英語)をご覧ください。
例
America/Los_Angeles
America/Argentina/Buenos_Aires
タイムゾーン名を使用する場合、名前と、残りのタイムスタンプの間にスペースが 1 つ必要です。
2014-09-27 12:30:00.45 America/Los_Angeles
タイムゾーン名によって 1 年の特定の期間に同じ時刻が偶然レポートされたとしても、すべてのタイムゾーン名が交換可能なわけではありません。たとえば、夏時間中に America/Los_Angeles
が UTC-7:00
と同じ時刻をレポートしたとしても、夏時間以外では同じ時刻は UTC-8:00
としてレポートされます。
タイムゾーンが指定されていない場合、デフォルトのタイムゾーンが使用されます。
うるう秒
タイムスタンプは 1970-01-01 00:00:00 UTC からの単純なオフセットであり、1 分が正確に 60 秒であることを前提にしています。保存されたタイムスタンプには、うるう秒は表示されません。
うるう秒を表すために秒フィールドで「:60」を使用する値が入力値に含まれている場合、タイムスタンプ値に変換されると、そのうるう秒は表示されなくなります。代わりに、その値は次の分の秒フィールドで「:00」を含むタイムスタンプとして解釈されます。
うるう秒はタイムスタンプの計算に影響を及ぼしません。すべてのタイムスタンプの計算は、うるう秒が反映されない Unix スタイルのタイムスタンプを使用して行われます。うるう秒は、実際の世界の時刻を測定する関数を使用する場合にのみ認識されます。このような関数では、うるう秒が発生すると、タイムスタンプの秒をスキップまたは繰り返すことができます。