首页 / 日期
FROM_UNIXTIME 时间戳转日期
FROM_UNIXTIME 把以秒为单位的 Unix 时间戳转换为日期时间。各引擎的返回类型、格式参数和时区处理不同,Hologres 需要改用 TO_TIMESTAMP。
各引擎写法
| 引擎 | 支持 | 写法 | 说明 | 依据 |
|---|---|---|---|---|
| MaxCompute | 支持 | FROM_UNIXTIME(unixtime) |
输入为秒,返回 DATETIME。默认只接受一个参数;开启 Hive 兼容模式后可以传第二个参数指定格式。 | 官方文档 |
| Hologres | 需改写 | TO_TIMESTAMP(seconds) |
文档中没有 FROM_UNIXTIME。TO_TIMESTAMP(double precision) 按秒转换,返回 TIMESTAMPTZ。需要字符串时再用 TO_CHAR。 | 官方文档 |
| StarRocks | 支持 | from_unixtime(unix_timestamp[, string_format]) |
返回 VARCHAR,默认格式 yyyy-MM-dd HH:mm:ss。小于 0 或大于 253402243199 时返回 NULL。 | 官方文档 |
| Doris | 支持 | FROM_UNIXTIME(unix_timestamp[, string_format]) |
格式可以写 %Y-%m-%d %H:%i:%s,也可以写 yyyy-MM-dd HH:mm:ss。超出 0~32536771199 时返回 NULL。 | 官方文档 |
| Hive | 支持 | from_unixtime(unixtime[, pattern]) |
输入为距 1970-01-01 00:00:00 UTC 的秒数,返回 string。 | 官方文档 |
| Spark SQL | 支持 | from_unixtime(unix_time[, fmt]) |
Spark 1.5.0 起提供,结果按会话时区显示。 | 官方文档 |
| Flink SQL | 支持 | FROM_UNIXTIME(numeric[, string]) |
返回字符串,默认格式 yyyy-MM-dd HH:mm:ss,结果按会话时区表示。 | 官方文档 |
迁移注意事项
- 输入单位是秒。13 位的毫秒时间戳要先除以 1000,否则结果会落在很远的未来,或因超出范围返回 NULL。
- 返回类型不同:MaxCompute 返回 DATETIME,Hologres 的 TO_TIMESTAMP 返回 TIMESTAMPTZ,其他引擎返回字符串。拿结果做日期计算前,确认是否需要再转换类型。
- 结果受会话时区影响。Spark 文档的示例中,from_unixtime(0) 返回 1969-12-31 16:00:00,因为示例环境的时区是 UTC-8。
- StarRocks 和 Doris 对负数时间戳返回 NULL,1970 年以前的时间无法用这个函数转换。
示例
把秒级时间戳转为日期时间
SELECT FROM_UNIXTIME(ts_sec) FROM events;SELECT TO_CHAR(TO_TIMESTAMP(ts_sec), 'YYYY-MM-DD HH24:MI:SS') FROM events;SELECT from_unixtime(ts_sec) FROM events;SELECT FROM_UNIXTIME(ts_sec) FROM events;毫秒时间戳
SELECT from_unixtime(CAST(ts_ms / 1000 AS BIGINT)) FROM events;SELECT from_unixtime(CAST(ts_ms / 1000 AS BIGINT)) FROM events;