You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle SQL中转换Unix时间戳为日期结果异常的求助

Oracle中Unix时间戳转日期的正确实现

问题背景

从RESTful接口获取的JSON数据里,Paid_at字段值为Unix时间戳1696484073,尝试以下两种Oracle SQL转换方式均得到错误结果:

  • 执行TO_TIMESTAMP('1970-01-01', 'YYYY-MM-DD') + NUMTODSINTERVAL(nvl(l_payment_date,0), 'SECOND'),得到错误日期10/05/23;
  • 先转字符串再用TO_DATE转换,得到错误日期03/02/15。

需要将该时间戳正确转换为日期并赋值给变量l_payment_date_trans。

正确解决方案

Unix时间戳的定义是从1970-01-01 00:00:00 UTC开始累计的秒数,错误的核心原因是忽略了时区差异,或者基准时间的格式定义不完整。以下是两种可靠的实现方式:

方式1:基于UTC时区的标准转换(推荐)

利用Oracle的时区函数确保转换不受数据库本地时区影响,同时支持任意目标时区:

DECLARE
  l_payment_date NUMBER := 1696484073;
  l_payment_date_trans TIMESTAMP WITH TIME ZONE;
BEGIN
  SELECT FROM_TZ(TO_TIMESTAMP('1970-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), 'UTC')
         + NUMTODSINTERVAL(l_payment_date, 'SECOND')
         AT TIME ZONE 'Asia/Shanghai' -- 替换为你的业务所需时区
  INTO l_payment_date_trans
  FROM DUAL;
  
  -- 如果需要转换为DATE类型,可添加CAST:
  -- l_payment_date_trans := CAST(上述结果 AS DATE);
END;

说明:FROM_TZ将基准时间绑定到UTC时区,加上秒数间隔后转换为目标时区,避免了本地时区偏移导致的错误。时间戳1696484073对应的UTC时间是2023-10-05 08:14:33,东8区时间为2023-10-05 16:14:33。

方式2:简化的日期计算(适合同步时区场景)

如果数据库本地时区与目标时区一致,可直接通过天数换算实现:

DECLARE
  l_payment_date NUMBER := 1696484073;
  l_payment_date_trans DATE;
BEGIN
  SELECT TO_DATE('1970-01-01', 'YYYY-MM-DD') + l_payment_date/86400
  INTO l_payment_date_trans
  FROM DUAL;
END;

说明:86400是一天的总秒数,l_payment_date/86400将秒数转为天数,直接加到1970-01-01基准日期上,前提是数据库时区与业务要求的时区一致。

内容的提问来源于stack exchange,提问作者Kurtonio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 13:04:53