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

Oracle中将DD-MM-YY格式日期转换为epoch时间戳并新增列的咨询

Oracle日期列转Unix时间戳存储实现方案

前置说明

你给出的示例03-06-21转换为1622671200,对应的是东八区(UTC+8)2021年6月3日零点的Unix时间戳,以下方案默认适配该时区,其他时区可调整时差参数。

操作步骤

1. 新增Unix时间戳存储列

执行SQL新增数值类型列,10位长度足够存储秒级Unix时间戳:

ALTER TABLE 你的表名 ADD (unix_timestamp NUMBER(10));

2. 验证转换逻辑(必须先验证再执行更新)

先运行查询语句确认转换结果符合预期,避免直接更新出错:

SELECT
  原日期列名,
  (TO_DATE(原日期列名, 'DD-MM-RR') - TO_DATE('1970-01-01', 'YYYY-MM-DD')) * 86400 - 28800 AS computed_unix_ts
FROM 你的表名
WHERE ROWNUM <= 10;

说明:

  • 用DD-MM-RR而不是DD-MM-YY格式,是因为RR格式会自动识别两位数年份所属的世纪,避免21年被识别为1921的问题
  • 86400是一天的秒数,28800是东八区和UTC的时差秒数,其他时区可自行调整该值
  • 如果原日期列本身是Oracle DATE类型而非字符串存储,直接去掉TO_DATE(原日期列名, 'DD-MM-RR')的转换,直接用原列名即可

3. 批量更新全表数据

验证转换结果正确后,执行更新语句写入新列:

UPDATE 你的表名
SET unix_timestamp = (TO_DATE(原日期列名, 'DD-MM-RR') - TO_DATE('1970-01-01', 'YYYY-MM-DD')) * 86400 - 28800;
COMMIT;

可选配置:自动同步新插入数据

如果需要后续新插入的数据自动生成时间戳,可创建触发器:

CREATE OR REPLACE TRIGGER trg_表名_auto_unix_ts
BEFORE INSERT ON 你的表名
FOR EACH ROW
BEGIN
  :NEW.unix_timestamp := (TO_DATE(:NEW.原日期列名, 'DD-MM-RR') - TO_DATE('1970-01-01', 'YYYY-MM-DD')) * 86400 - 28800;
END;
/

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 19:09:05