Oracle如何将Timestamp截断至毫秒精度
将Oracle微秒精度Timestamp转换为毫秒精度的方法
刚好处理过类似的需求,下面分享几种纯SQL和PL/SQL的实现方式,都能把CURRENT_TIMESTAMP生成的6位微秒精度时间转成3位毫秒精度的Timestamp,直接可以存储到对应字段里:
方法一:字符串转换法(SQL/PL/SQL通用)
这是最直观的方式,先把Timestamp转成带3位小数的字符串,再转回Timestamp类型:
-- SQL示例 SELECT CAST(TO_CHAR(CURRENT_TIMESTAMP, 'YYYY-MM-DD HH24:MI:SS.FF3') AS TIMESTAMP) FROM dual;
如果是在PL/SQL块里使用:
DECLARE target_ts TIMESTAMP; BEGIN target_ts := CAST(TO_CHAR(CURRENT_TIMESTAMP, 'YYYY-MM-DD HH24:MI:SS.FF3') AS TIMESTAMP); -- 这里可以执行插入或更新操作,比如 INSERT INTO your_table(ts_column) VALUES(target_ts); END; /
原理:FF3格式符指定只保留3位小数(毫秒级),转换后再CAST回Timestamp,就得到了想要的精度。
方法二:日期截断与区间计算法(纯SQL)
通过提取时间各部分并重新拼接,实现精度截断:
SELECT TRUNC(CURRENT_TIMESTAMP, 'MI') + NUMTODSINTERVAL(EXTRACT(SECOND FROM CURRENT_TIMESTAMP), 'SECOND') + NUMTODSINTERVAL(FLOOR(EXTRACT(MILLISECOND FROM CURRENT_TIMESTAMP)/1000)*1000, 'MILLISECOND') FROM dual;
解释:
TRUNC(CURRENT_TIMESTAMP, 'MI')把时间截断到分钟- 加上提取的秒部分
- 提取毫秒部分后取整到千位(即保留前3位),再转成时间区间加回去
方法三:字段精度限制法(最省心)
如果是要存储到表中,直接在创建表时指定Timestamp字段的精度为3:
CREATE TABLE your_table ( ts_column TIMESTAMP(3) -- 明确指定3位小数精度(毫秒级) ); -- 插入时直接用CURRENT_TIMESTAMP,Oracle会自动截断到3位小数 INSERT INTO your_table(ts_column) VALUES(CURRENT_TIMESTAMP);
这种方式不需要额外转换,插入时数据库自动处理精度截断,非常适合长期存储的场景。
内容的提问来源于stack exchange,提问作者Bastian Voigt
相关产品推荐
相关产品推荐

