跳到主要内容

to_unix_timestamp:日期转 Unix 时间戳

速查结论

to_unix_timestamp(timeExp[, fmt]) 是 Spark SQL 中用于**将日期/时间表达式转为 Unix 时间戳(秒)**的函数。支持字符串(需指定格式)、日期和时间戳类型的输入。默认格式为 yyyy-MM-dd HH:mm:ss

语法

to_unix_timestamp(timeExp[, fmt])

参数说明

参数说明
timeExp日期/时间戳或字符串表达式
fmt可选,日期格式模式。仅当 timeExp 为字符串时生效。默认值 yyyy-MM-dd HH:mm:ss

返回值:自 1970-01-01 00:00:00 UTC 以来的秒数(BIGINT 类型)。

Since: 1.6.0

示例

基础用法

-- 字符串 + 指定格式
SELECT to_unix_timestamp('2016-04-08', 'yyyy-MM-dd');
-- 结果: 1460098800

-- 字符串 + 默认格式
SELECT to_unix_timestamp('2016-04-08 00:00:00');
-- 结果: 1460073600

不同格式的转换

-- 带时间的完整格式
SELECT to_unix_timestamp('2016-04-08 12:30:00', 'yyyy-MM-dd HH:mm:ss');
-- 结果: 1460098800

-- 斜杠分隔
SELECT to_unix_timestamp('2016/04/08', 'yyyy/MM/dd');

时间戳列直接转换

-- timeExp 为时间戳列时,fmt 参数被忽略
SELECT to_unix_timestamp(TIMESTAMP('2016-04-08 00:00:00'));
-- 结果: 1460073600

to_unix_timestamp vs unix_timestamp vs unix_seconds 对比

函数输入类型返回单位特点
to_unix_timestamp(timeExp, fmt)字符串/日期/时间戳可指定字符串格式
unix_timestamp([timeExp, fmt])无参/字符串/日期无参时返回当前时间戳
unix_seconds(timestamp)时间戳仅接受时间戳类型
-- to_unix_timestamp: 字符串转时间戳
SELECT to_unix_timestamp('2016-04-08', 'yyyy-MM-dd');
-- 结果: 1460098800

-- unix_timestamp: 无参返回当前 Unix 时间戳
SELECT unix_timestamp();
-- 结果: 1587801600(示例值)

常见报错与避坑指南

格式不匹配导致返回 NULL

当 timeExp 是字符串且格式不匹配时,Spark 3.0+ 返回 NULL(而非报错)。

-- 格式不匹配:返回 NULL
SELECT to_unix_timestamp('2016-04-08', 'yyyy/MM/dd');
-- 结果: NULL('-' 和 '/' 不匹配)

-- 格式匹配输入
SELECT to_unix_timestamp('2016-04-08', 'yyyy-MM-dd');
-- 结果: 1460098800

时区影响

to_unix_timestamp 的结果受系统时区影响。同一时间戳在不同时区环境下可能返回不同的 Unix 时间戳值。

-- 查看当前时区
SET spark.sql.session.timeZone;

-- UTC 时间不受时区转换影响
SELECT to_unix_timestamp('2016-04-08 00:00:00', 'yyyy-MM-dd HH:mm:ss');
📱关注公众号

「数据仓库技术」文章同步更新,不错过每一篇干货

微信公众号二维码
💬加群交流

备注「数据仓库技术」加入社群,每日一道大厂SQL真题

交流微信二维码

你可能还想看