本页面简要介绍了所有 Google 标准 SQL 数据类型,包括其值网域的相关信息。如需了解数据类型字面量和构造函数,请参阅词法结构和语法。
数据类型属性
在存储和查询数据时,记住以下数据类型属性会很有帮助:
可以为 Null 的数据类型
对于可为 Null 的数据类型,NULL
是一个有效值。目前,所有现有数据类型均可为 Null,但对于 ARRAY 有条件。
可排序的数据类型
可排序的数据类型的表达式可在 ORDER BY
子句中使用。适用于除以下类型之外的其他所有数据类型:
ARRAY
STRUCT
GEOGRAPHY
JSON
对 NULL 进行排序
在 ORDER BY
子句的上下文中,NULL
是最小的可能值;也就是说,以 ASC
顺序排序时,NULL
会最先显示,而以 DESC
顺序排序时,则会最后显示。
分别通过使用 NULLS FIRST
或 NULLS LAST
修饰符,可将 NULL
值指定为列的第一个值或最后一个值,与 ASC
或 DESC
无关。
如需详细了解如何使用 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 的查询会返回错误。正确的做法是,您必须使用 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 和空 ARRAY 是两个不同的值,但 BigQuery 会在查询结果中将NULL
ARRAY 转换为空数组。例如:
WITH Items AS ( SELECT [] AS numbers UNION ALL SELECT CAST(NULL AS ARRAY<INT64>)) SELECT numbers FROM Items; +---------+ | numbers | +---------+ | [] | | [] | +---------+
如果查询结果含有包含
NULL
元素的 ARRAY,则 BigQuery 会引发错误,虽然此类 ARRAY 可以在查询中使用。例如,以下示例可以正常工作:
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 位整数。 |
ARRAY<ARRAY<INT64>>
(不受支持) |
这是一个无效的类型声明,列于此处的目的在于防止您来此查找创建多层 ARRAY 的相关信息。ARRAY 不能直接包含 ARRAY。请参阅下一个示例。 |
ARRAY<STRUCT<ARRAY<INT64>>>
|
由 64 位整数 ARRAY 组成的 ARRAY 类型。请注意,两个 ARRAY 之间存在 STRUCT,因为 ARRAY 不能直接包含其他 ARRAY。 |
构建 ARRAY
您可以使用数组字面量或数组函数构建 ARRAY。如需了解操作方法,请参阅使用数组。
布尔值类型
名称 | 说明 |
---|---|
BOOL |
布尔值由关键字 TRUE 和 FALSE (不区分大小写)表示。 |
布尔值会按以下顺序排序(从最小值到最大值):
NULL
FALSE
TRUE
字节类型
名称 | 说明 |
---|---|
BYTES |
长度可变的二进制数据。 |
STRING 和 BYTES 是不能互换使用的独立类型。STRING 的大多数函数在 BYTES 中也存在定义,但 BYTES 的那些函数会针对原始字节(而非 Unicode 字符)进行运算。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 小时时间段,并且可能代表夏令时转换期间较短或较长的一天。 如需表示绝对的时间点,请使用时间戳。
标准格式
'YYYY-[M]M-[D]D'
YYYY
:以四位数字表示的年份[M]M
:以一位或两位数字表示的月份[D]D
:以一位或两位数字表示的日期
日期时间类型
名称 | 范围 |
---|---|
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
:以四位数字表示的年份[M]M
:以一位或两位数字表示的月份[D]D
:以一位或两位数字表示的日期( |T)
:空格或T
分隔符[H]H
:以一位或两位数字表示的小时(有效值为 00 到 23)[M]M
:以一位或两位数字表示的分钟(有效值为 00 到 59)[S]S
:以一位或两位数字表示的秒钟(有效值为 00 到 59)[.F]
:最多六个小数位(即高达微秒的精度)
地理位置类型
名称 | 说明 |
---|---|
GEOGRAPHY |
点、线和面的集合,表示为一个点集或地球表面的部分区域。 |
GEOGRAPHY
类型基于 OGC 简单要素规范 (SFS),是以下对象的集合:
- 点地理位置:坐标空间中的单个位置。点具有 x 坐标值和 y 坐标值,其中 x 坐标为点在 WGS84 参考椭球体上的经度,y 坐标为纬度。
- 线串地理位置:一维几何对象,包含一系列点和它们之间的测地线边。
- 多边形地理位置:由 1 个外部边界和 0 个或多个内部边界定义的平面。每个内部边界定义多边形中的一个孔。多边形的边界环是定向的,因此,如果您按顺序遍历边界顶点,则多边形的内部位于左侧。
一个 GEOGRAPHY
值的点、线串和多边形在 WGS84 参考椭球体上形成一个简单排列。简单排列是指集合的多个元素不包含 WGS84 表面上任何点的排列方式。如果存在自相交,系统会自动移除它们。
不包含点、线串或多边形的 GEOGRAPHY
称为空 GEOGRAPHY
。
GEOGRAPHY
是地理位置函数的结果或参数。
间隔类型
名称 | 范围 |
---|---|
INTERVAL |
-10000-0 -3660000 -87840000:0:0 至 10000-0 3660000 87840000:0:0 |
INTERVAL 对象表示时长或时间。时间间隔由三个独立部分组成:
[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]
:最多六个小数位(即高达微秒的精度)
JSON 类型
名称 | 说明 |
---|---|
JSON |
表示 JSON,一种轻量级数据交换格式。 |
在创建 JSON
类型的值时,预计会出现以下规范化行为:
- 系统保留布尔值、字符串和 null 值。
- 空格字符不会被保留。
- 提取 JSON 数据时,所有数字都会转换为
FLOAT64
。因此,无法保证这些范围内的精度:- 9,007,199,254,740,993 到 9,223,372,036,854,775,807(含)之间。
- -9,223,372,036,854,775,808 到 -9,007,199,254,740,993(含)之间。
- 数组中的元素顺序保持不变。
- 对象成员的顺序无法保证或保留。
- 如果对象具有重复的键,则保留第一个键。
- 最多可以嵌套 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]) |
NUMERIC 或 DECIMAL 类型,最大精度为 P,最大标度为 S,其中 P 和 S 为 INT64 类型。如果未指定,则 S 被解释为 0。最大标度范围:0 ≤ S ≤ 9 最大精度范围:max(1, S) ≤ P ≤ S + 29 |
BIGNUMERIC(P[, S])
BIGDECIMAL(P[, S]) |
BIGNUMERIC 或 BIGDECIMAL 类型,最大精度为 P,最大标度为 S,其中 P 和 S 为 INT64 类型。如果未指定,则 S 被解释为 0。最大标度范围:0 ≤ S ≤ 38 最大精度范围:max(1, S) ≤ P ≤ S + 38 |
如果值包含的小数位数超过 S,则该值会四舍五入到 S 位小数。例如,如果将值 1.125 插入到 NUMERIC(5, 2) 列中,则会将 1.125 向上舍入到 1.13。
如果值包含的位数超过 P,则会抛出 OUT_OF_RANGE
错误。例如,将 1111 插入 NUMERIC(5, 2) 列会返回 OUT_OF_RANGE
错误,因为 1111 大于 999.99,即 NUMERIC(5, 2) 列中允许的最大值。
如需详细了解参数化类型及其使用位置,请参阅参数化数据类型。
浮点类型
浮点值是含有小数部分的近似数值。
名称 | 说明 |
---|---|
FLOAT64 |
双精度(近似)数值。 |
浮点语义
使用浮点数时,需要考虑特殊的非数值:NaN
和 +/-inf
算术运算符可为产生有限输出的所有有限输入值和至少有一个非有限输入的所有运算提供标准 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
可能具有不确定性,并且对相同表执行同一查询两次可能会产生不同的结果。 - 如果您担心上述浮点值问题,请改用小数类型。
数学函数示例
左侧运算对象 | 运算符 | 右侧运算对象 | 返回值 |
---|---|---|---|
任意值 | + |
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 字符)进行运算。STRING 和 BYTES 是不能互换使用的独立类型。任何方向都不存在隐式类型转换。STRING 和 BYTES 之间的显式类型转换采用 UTF-8 编码和解码。如果字节不是有效的 UTF-8 编码,则将 BYTES 转换为 STRING 时会返回错误。
参数化字符串类型
参数化类型 | 说明 |
---|---|
STRING(L) |
最多允许 L 个 Unicode 字符的字符串,其中 L 是一个正 INT64 值。如果分配的字符串包含的 Unicode 字符数超过 L,则会抛出 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 两个字段,二者都是 64 位整数。 |
STRUCT<inner_array ARRAY<INT64>>
|
包含名为 inner_array 的 ARRAY 且 ARRAY 由 64 位整数元素组成的 STRUCT 类型。 |
构造 STRUCT
元组语法
(expr1, expr2 [, ... ])
输出类型是具有匿名字段的匿名 STRUCT 类型,其类型与输入表达式的类型相匹配。必须指定至少两个表达式。否则无法区分该语法与用圆括号括起来的表达式。
示例
语法 | 输出类型 | 说明 |
---|---|---|
(x, x+y) |
STRUCT<?,?> |
如果使用列名称(未加引号的字符串),则 STRUCT 字段数据类型由列数据类型派生而来。x 和 y 是列,因此 STRUCT 字段的数据类型由列类型和加法运算符的输出类型派生而来。 |
对于使用多部分键的比较表达式,此语法还可与 STRUCT 比较搭配使用,例如,在 WHERE
子句中:
WHERE (Key1,Key2) IN ( (12,34), (56,78) )
无类型结构体语法
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<[field_name] field_type, ...>( expr1 [, ... ])
类型化语法允许使用显式 STRUCT 数据类型来构造 STRUCT。输出类型与提供的 field_type
类型完全一致。如果两种类型不相同,则输入表达式会被强制转换为 field_type
指定的类型;如果类型不兼容,则会产生错误。输入表达式不允许使用 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 的同名字段,则可直接比较个别字段。
时间类型
名称 | Range |
---|---|
TIME |
00:00:00 到 23:59:59.999999 |
TIME 值按照时钟上的显示方式来表示一天中的时间,与具体的时间和时区无关。如需表示绝对的时间点,请使用时间戳。
标准格式
[H]H:[M]M:[S]S[.DDDDDD|.F]
[H]H
:以一位或两位数字表示的小时(有效值为 00 到 23)[M]M
:以一位或两位数字表示的分钟(有效值为 00 到 59)[S]S
:以一位或两位数字表示的秒钟(有效值为 00 到 59)[.F]
:最多六个小数位(即高达微秒的精度)
时间戳类型
名称 | 范围 |
---|---|
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
:用四位数表示的年份[M]M
:以一位或两位数字表示的月份[D]D
:以一位或两位数字表示的日期( |T)
:空格或T
分隔符[H]H
:以一位或两位数字表示的小时(有效值为 00 到 23)[M]M
:以一位或两位数字表示的分钟(有效值为 00 到 59)[S]S
:以一位或两位数字表示的秒钟(有效值为 00 到 59)[.F]
:最多六个小数位(即高达微秒的精度)[time_zone]
:表示时区的字符串。如果未明确指定时区,则使用默认时区,即世界协调时间 (UTC)。如需了解详情,请参阅时区部分。
时区
从民用日期或时间(可能在日历或时钟上的显示方式)转换为时间戳(绝对时间)时,会用到时区。这包括解析包含民用日期和时间(如“2020-01-01 00:00:00”)的字符串并将其转换为时间戳的操作。生成的时间戳值本身不会存储特定的时区,因为它表示全球某一时刻。
时区由以下任一标准格式的字符串表示:
- 世界协调时间 (UTC) 的偏移量或代表 UTC 的字母
Z
- tz 数据库中的时区名称
以下时间戳是等效的,因为对于指定日期和时间,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 数据库。 请参阅维基百科上的 tz 数据库时区列表,其中提供了虽不全面但较为简单的参考信息。
示例
America/Los_Angeles
America/Argentina/Buenos_Aires
使用时区名称时,名称和时间戳的其余部分之间必须留有空格:
2014-09-27 12:30:00.45 America/Los_Angeles
注意:并非所有时区名称都可以互换,即使这些时区在一年当中的某些特定期间恰好报告了相同的时间。例如,在夏令时期间,America/Los_Angeles
报告的时间与 UTC-7:00
相同;但在非夏令时期间,其报告的时间与 UTC-8:00
相同。
如果未指定时区,则使用默认时区值。
闰秒
时间戳只是相对于世界协调时间 (UTC) 1970-01-01 00:00:00 的偏移量(假设每分钟正好 60 秒)。存储的时间戳不能表示闰秒。
如果输入包含在秒钟字段中使用“:60”来表示闰秒的值,则系统不会在转换为时间戳值时保留该闰秒,而是会将该值解释为下一分钟的时间戳(秒钟字段的值为“:00”)。
闰秒不会影响时间戳的计算。所有时间戳均使用 Unix 样式的时间戳进行计算,而这种样式的时间戳不能体现闰秒。闰秒只能通过测定真实世界时间的函数进行观察。在这些函数中,若存在闰秒,系统可能会跳过或重复时间戳的秒值。