首页 / 日期
UNIX_TIMESTAMP 日期转时间戳
UNIX_TIMESTAMP 把日期时间转换为距 1970-01-01 的秒数。各引擎都返回秒,但格式参数的写法、时区处理和超出范围时的结果不同,Hologres 要改用 EXTRACT(EPOCH FROM ...)。
各引擎写法
| 引擎 | 支持 | 写法 | 说明 | 依据 |
|---|---|---|---|---|
| MaxCompute | 支持 | UNIX_TIMESTAMP(date) |
输入可以是 DATETIME、DATE、TIMESTAMP 或固定格式的字符串,返回秒级 BIGINT,小数秒会被丢弃。不支持格式参数。新类型系统下字符串需要先 CAST 为 DATETIME。 | 官方文档 |
| Hologres | 需改写 | EXTRACT(EPOCH FROM ts) |
日期函数中没有 UNIX_TIMESTAMP。EXTRACT 的 epoch 字段返回秒数,类型是 DOUBLE PRECISION。 | 官方文档 |
| StarRocks | 支持 | UNIX_TIMESTAMP([date[, fmt]]) |
返回 BIGINT。fmt 用 %Y-%m-%d 风格。早于 1970-01-01 或晚于 2038-01-19 11:14:07 时返回 0,结果受时区影响。 | 官方文档 |
| Doris | 支持 | UNIX_TIMESTAMP([date[, fmt]]) |
fmt 用 %Y-%m-%d 风格。传入格式参数或带小数秒的输入时返回 DECIMAL;超出 1970~3001 年的范围时返回 0。结果受会话时区影响。 | 官方文档 |
| Hive | 支持 | unix_timestamp(date[, pattern]) |
返回秒级 bigint。不带参数取当前时间的写法从 Hive 2.0 起已不推荐,建议用 CURRENT_TIMESTAMP。 | 官方文档 |
| Spark SQL | 支持 | unix_timestamp([timeExp[, fmt]]) |
Spark 1.5.0 起提供,默认格式 yyyy-MM-dd HH:mm:ss。另有 to_unix_timestamp。 | 官方文档 |
| Flink SQL | 支持 | UNIX_TIMESTAMP(string1[, string2]) |
默认格式 yyyy-MM-dd HH:mm:ss。不带参数时返回当前时间的秒数。 | 官方文档 |
迁移注意事项
- 格式参数的写法不同:StarRocks 和 Doris 用 %Y-%m-%d %H:%i:%s,Hive、Spark 和 Flink 用 yyyy-MM-dd HH:mm:ss,MaxCompute 不支持格式参数。
- StarRocks 对 2038-01-19 之后的时间返回 0,不报错。远期日期(例如有效期 2099-12-31)转换后会变成 0,很难发现。
- 结果受会话时区影响。同一个日期字符串在 UTC 和东八区下相差 28,800 秒,跨引擎核对数据时先确认时区设置。
- Doris 传入格式参数时返回 DECIMAL 而不是整数,写入 BIGINT 列前需要 CAST。
示例
把下单时间转为秒级时间戳
SELECT UNIX_TIMESTAMP(order_time) FROM orders;SELECT EXTRACT(EPOCH FROM order_time) FROM orders;SELECT UNIX_TIMESTAMP(order_time_str, '%Y-%m-%d %H:%i:%s') FROM orders;SELECT unix_timestamp(order_time_str, 'yyyy-MM-dd HH:mm:ss') FROM orders;