TO_TIMESTAMP / TO_TIMESTAMP_*¶
将输入表达式转换为相应的时间戳:
TO_TIMESTAMP_LTZ (包含本地时区的时间戳)
TO_TIMESTAMP_NTZ (不包含时区的时间戳)
TO_TIMESTAMP_TZ (包含时区的时间戳)
备注
根据 TIMESTAMP_TYPE_MAPPING 会话参数,TO_TIMESTAMP 映射到其他某个时间戳函数。参数默认值为 TIMESTAMP_NTZ,因此 TO_TIMESTAMP 默认映射到 TO_TIMESTAMP_NTZ。
语法¶
timestampFunction ( <numeric_expr> [ , <scale> ] )
timestampFunction ( <date_expr> )
timestampFunction ( <timestamp_expr> )
timestampFunction ( <string_expr> [ , <format> ] )
timestampFunction ( '<integer>' )
timestampFunction ( <variant_expr> )
其中:
timestampFunction ::= TO_TIMESTAMP | TO_TIMESTAMP_LTZ | TO_TIMESTAMP_NTZ | TO_TIMESTAMP_TZ
实参¶
必填:
其中之一:
numeric_expr
自 Unix 纪元时间 (1970-01-01 00:00:00 UTC) 开始以来的秒数(如果小数位数 = 0 或不存在)或几分之一秒(例如毫秒或纳秒)。如果输入非整数小数表达式,则继承结果的小数位数。
date_expr
要转换为时间戳的日期。
timestamp_expr
要转换为其他时间戳的时间戳(例如,将 TIMESTAMP_LTZ 转换为 TIMESTAMP_NTZ)。
string_expr
要从中提取时间戳的字符串,例如“2019-01-31 01:02:03.004”。
'integer'
计算结果为包含整数的 字符串 的表达式,例如“15000000”。根据字符串的大小,它可以解释为秒、毫秒、微秒或纳秒。有关详细信息,请参阅下面的 使用说明。
备注
不建议使用带引号的整数作为输入内容。
variant_expr
类型 VARIANT 的表达式。VARIANT 必须包含以下内容之一:
要从中提取时间戳的字符串。
时间戳。
整数秒数或毫秒数。
包含整数秒数或毫秒数的字符串。
虽然 TO_TIMESTAMP 接受一个 DATE 值,但它不接受 VARIANT 内的 DATE。
可选:
format
格式说明符(仅适用于
string_expr
)。有关更多信息,请参阅 转换函数 中的 日期和时间格式。默认值为 TIMESTAMP_INPUT_FORMAT 参数的当前值(通常为 AUTO)。
scale
小数位数说明符(仅适用于
numeric_expr
)。如果已指定,则定义所提供数字的小数位数。例如:对于秒,小数位数 = 0。
对于毫秒,小数位数 = 3。
对于纳秒,小数位数 = 9。
返回¶
返回值的数据类型是 TIMESTAMP
数据类型。默认情况下,数据类型为 TIMESTAMP_NTZ
。您可以设置会话参数 TIMESTAMP_TYPE_MAPPING,从而对此进行更改。
使用说明¶
此系列函数返回时间戳值,具体如下:
对于 NULL 输入,结果将为 NULL。
对于
string_expr
:由给定字符串表示的时间戳。如果字符串没有时间组件,则将使用午夜。对于
date_expr
:根据特定时间戳风格 (NTZ/LTZ/TZ) 语义使用表示给定日期午夜的时间戳。对于
timestamp_expr
:可能与源时间戳风格不同的时间戳。对于
numeric_expr
:表示用户提供的秒数(或几分之一秒)的时间戳。请注意,该 UTC 时间始终用于构建结果。对于
variant_expr
:如果变体包含 JSON null 值,则结果将为 NULL。
如果变体包含与结果类型相同的时间戳值,则此值将按原样保留。
如果变体包含不同类型的时间戳值,则将以与
timestamp_expr
相同的方式完成转换。如果变体包含字符串,则将执行从字符串值的转换(使用自动格式)。
如果变体包含数字,则将执行类似于
numeric_expr
的转换。备注
当 INTEGER 值直接转换为 TIMESTAMP_NTZ 时,该整数被视为自 Linux 纪元时间开始以来的秒数,并且不考虑本地时区。(有关详细信息,请参阅 TO_TIMESTAMP / TO_TIMESTAMP_*。):emph:但是,如果 INTEGER 值存储在 VARIANT 值内,例如如下所示,则转换是间接的,并且受本地时区的影响,即使最终结果是 TIMESTAMP_NTZ:
select to_timestamp(parse_json(31000000)); select parse_json(31000000)::timestamp_ntz;
要独立于本地时区进行转换,请在表达式中添加显式转换为整数,如下所示:
select to_timestamp(parse_json(31000000)::int); select parse_json(31000000)::int::timestamp_ntz;
无论是类型转换为 TIMESTAMP_NTZ 还是调用函数 TO_TIMESTAMP_NTZ(),都适用。如果将 TIMESTAMP_TYPE_MAPPING 参数设置为 TIMESTAMP_NTZ,当调用 TO_TIMESTAMP() 时,此函数也适用。
有关输出的示例,请参阅本主题末尾的示例。
如果无法进行转换,则会返回错误。
如果输入参数的格式是包含整数的字符串:
将字符串转换为整数后,该整数被视为自 Unix 纪元时间 (1970-01-01 00:00:00.000000000 UTC) 开始后的秒数、毫秒数、微秒数或纳秒数。
如果整数小于 31536000000(一年中的毫秒数),则该值被视为秒数。
如果该值大于或等于 31536000000 且小于 31536000000000,则该值被视为毫秒数。
如果该值大于或等于 31536000000000 且小于 31536000000000000,则该值被视为微秒数。
如果该值大于或等于 31536000000000000,则该值被视为纳秒数。
备注
弃用警告:未来版本的 Snowflake 可能会自动将字符串化的整数值解释为秒数,而不是毫秒数、微秒数或纳秒数。Snowflake 建议您仅在打算将整数解释为秒数时,才使用包含整数的字符串调用 TO_DATE、TO_TIME 或 TO_TIMESTAMP。
如果评估多行(例如,如果输入内容是包含多行的表的列名),则每个值都将单独得到检查,以确定该值表示的是秒数、毫秒数、微秒数还是纳秒数。
使用 TO_TIMESTAMP_NTZ 或 TRY_TO_TIMESTAMP_NTZ 函数,转换带有时区信息的时间戳时,时区信息会丢失。如果将时间戳转换回带有时区信息的时间戳(例如,通过使用 TO_TIMESTAMP_TZ 函数),则时区信息不可恢复。
示例¶
此示例显示 TO_TIMESTAMP_TZ
创建了一个包含会话中时区的时间戳,但 TO_TIMESTAMP_NTZ
中的值不包含时区:
ALTER SESSION SET TIMEZONE = 'America/Los_Angeles';
+----------------------------------+
| status |
|----------------------------------|
| Statement executed successfully. |
+----------------------------------+
SELECT TO_TIMESTAMP_TZ('2013-04-05 01:02:03');
+----------------------------------------+
| TO_TIMESTAMP_TZ('2013-04-05 01:02:03') |
|----------------------------------------|
| 2013-04-05 01:02:03.000 -0700 |
+----------------------------------------+
SELECT TO_TIMESTAMP_NTZ('2013-04-05 01:02:03');
+-----------------------------------------+
| TO_TIMESTAMP_NTZ('2013-04-05 01:02:03') |
|-----------------------------------------|
| 2013-04-05 01:02:03.000 |
+-----------------------------------------+
此示例展示了不同的格式如何影响对不明确日期的解析:
SELECT TO_TIMESTAMP_TZ('04/05/2013 01:02:03', 'mm/dd/yyyy hh24:mi:ss');
+-----------------------------------------------------------------+
| TO_TIMESTAMP_TZ('04/05/2013 01:02:03', 'MM/DD/YYYY HH24:MI:SS') |
|-----------------------------------------------------------------|
| 2013-04-05 01:02:03.000 -0700 |
+-----------------------------------------------------------------+
SELECT TO_TIMESTAMP_TZ('04/05/2013 01:02:03', 'dd/mm/yyyy hh24:mi:ss');
+-----------------------------------------------------------------+
| TO_TIMESTAMP_TZ('04/05/2013 01:02:03', 'DD/MM/YYYY HH24:MI:SS') |
|-----------------------------------------------------------------|
| 2013-05-04 01:02:03.000 -0700 |
+-----------------------------------------------------------------+
此示例展示了如何使用表示从 1970 年 1 月 1 日午夜( UNIX EPOCH 开始)开始大约 40 年的数字输入:
ALTER SESSION SET TIMESTAMP_OUTPUT_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF9 TZH:TZM';
+----------------------------------+
| status |
|----------------------------------|
| Statement executed successfully. |
+----------------------------------+
SELECT TO_TIMESTAMP_NTZ(40 * 365.25 * 86400);
+---------------------------------------+
| TO_TIMESTAMP_NTZ(40 * 365.25 * 86400) |
|---------------------------------------|
| 2010-01-01 00:00:00.000 |
+---------------------------------------+
此示例与前面的示例类似,但通过将*小数位数*值设为 3 来提供以毫秒为单位的值:
ALTER SESSION SET TIMESTAMP_OUTPUT_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF9 TZH:TZM';
+----------------------------------+
| status |
|----------------------------------|
| Statement executed successfully. |
+----------------------------------+
SELECT TO_TIMESTAMP_NTZ(40 * 365.25 * 86400 * 1000 + 456, 3);
+-------------------------------------------------------+
| TO_TIMESTAMP_NTZ(40 * 365.25 * 86400 * 1000 + 456, 3) |
|-------------------------------------------------------|
| 2010-01-01 00:00:00.456 |
+-------------------------------------------------------+
此示例展示了函数如何根据值的大小确定要使用的单位(秒、毫秒、微秒或纳秒):
使用包含不同范围内的整数的字符串创建并加载表:
CREATE TABLE demo1 ( description VARCHAR, value VARCHAR -- string rather than bigint ); INSERT INTO demo1 (description, value) VALUES ('Seconds', '31536000'), ('Milliseconds', '31536000000'), ('Microseconds', '31536000000000'), ('Nanoseconds', '31536000000000000');将字符串传递给函数:
SELECT description, value, TO_TIMESTAMP(value), TO_DATE(value) FROM demo1 ORDER BY value;
以下示例展示了使用整数和使用包含整数的变体之间的行为差异:
SELECT 0::TIMESTAMP_NTZ, PARSE_JSON(0)::TIMESTAMP_NTZ, PARSE_JSON(0)::INT::TIMESTAMP_NTZ; +-------------------------+------------------------------+-----------------------------------+ | 0::TIMESTAMP_NTZ | PARSE_JSON(0)::TIMESTAMP_NTZ | PARSE_JSON(0)::INT::TIMESTAMP_NTZ | |-------------------------+------------------------------+-----------------------------------| | 1970-01-01 00:00:00.000 | 1969-12-31 16:00:00.000 | 1970-01-01 00:00:00.000 | +-------------------------+------------------------------+-----------------------------------+SELECT TO_TIMESTAMP_NTZ(0), TO_TIMESTAMP_NTZ(PARSE_JSON(0)), TO_TIMESTAMP_NTZ(PARSE_JSON(0)::INT); +-------------------------+---------------------------------+--------------------------------------+ | TO_TIMESTAMP_NTZ(0) | TO_TIMESTAMP_NTZ(PARSE_JSON(0)) | TO_TIMESTAMP_NTZ(PARSE_JSON(0)::INT) | |-------------------------+---------------------------------+--------------------------------------| | 1970-01-01 00:00:00.000 | 1969-12-31 16:00:00.000 | 1970-01-01 00:00:00.000 | +-------------------------+---------------------------------+--------------------------------------+