需求是这样的,oracle中a表有一个字段b,是timestamp类型,精度是6位
主键是id
我需要把里面的数据全部更新成3位精度
比如:
2022-12-06 12:59:51.833676
2022-12-06 12:59:51.844987
变成
2022-12-06 12:59:51.833(000)
2022-12-06 12:59:51.844(000)
*(000)是oracle自动补0不用管。只需要取得前三位更新数据就可以了
求指教是需要用plsql循环修改吗?有没有什么简单的办法
这个思路可以参考下,把所有数据先导出成sql文件备份,然后清空这个表的数据,把表结构这个字段的timestamp长度改为timestamp(3),然后再把刚才备份的sql数据批量插入就好啦,亲测可以,有帮助的话采纳一下吧
举个例子,如有帮助,望采纳
利用存储过程:
1)先执行以下sql生产函数--------------------
CREATE OR REPLACE
PROCEDURE UPDATE_TIME_TO_THREE( pram1 in varchar2,pram2 in varchar2)
IS
tableName varchar2(100) := pram1;
field varchar2(100) := pram2;
name varchar2(100) :='更新时间';
-- 时间精度,根据需求自定义
format varchar2(100) :='SYYYY-MM-DD HH24:MI:SS:FF3';
BEGIN
execute immediate 'ALTER TABLE '||tableName||' ADD (TEST_DATA TIMESTAMP(3))';
execute immediate 'UPDATE '||tableName||' SET TEST_DATA = TO_TIMESTAMP ( to_char ( '|| field ||', '''|| format ||''' ), '''|| format ||''' )';
execute immediate 'ALTER TABLE '||tableName||' DROP ('|| field ||')';
execute immediate 'ALTER TABLE '||tableName||' MODIFY (TEST_DATA NOT NULL )';
execute immediate 'ALTER TABLE '||tableName||' RENAME COLUMN TEST_DATA TO '|| field;
execute immediate 'COMMENT ON COLUMN '||tableName||'.'||field||' IS '''||name||'''';
END UPDATE_TIME_TO_THREE;
---------------------------------------------------------------------------------------------------------
1)执行以下sql 修改时间精度:第一个参数,是要修改的表名,第二个参数是要修改的字段------------
BEGIN
UPDATE_TIME_TO_THREE ('HJ_MENU','UPDATE_TIME');
END;
直接修改表结构字段就可以了,列会自动截取
提供参考实例【Oracle的timestamp字段】,链接:https://www.cnblogs.com/heyang78/p/12360499.html
建议先备份表,之后一条语句即可解决。
update ts set ts=to_timestamp(TO_CHAR(ts,'YYYY-MM-DD HH24:MI:SS.ff3'),'YYYY-MM-DD HH24:MI:SS.ff3', 'NLS_DATE_LANGUAGE=American');
完整测试;
CREATE TABLE "SCOTT"."TS"
( "TS" TIMESTAMP (9)
) ;
insert into ts values(to_timestamp('2022-12-06 12:59:51.833676','yyyy-mm-dd HH24.MI.SS.FF', 'NLS_DATE_LANGUAGE=American'));
insert into ts values(to_timestamp('2022-12-06 12:59:51.833676','yyyy-mm-dd HH24.MI.SS.FF', 'NLS_DATE_LANGUAGE=American'));
insert into ts values(to_timestamp('2022-12-06 12:59:51.844987','yyyy-mm-dd HH24.MI.SS.FF', 'NLS_DATE_LANGUAGE=American') );
commit;
select TO_CHAR(ts,'YYYY-MM-DD HH24:MI:SS.ff') FROM ts;
select TO_CHAR(ts,'YYYY-MM-DD HH24:MI:SS.ff3') FROM ts;
select to_timestamp(TO_CHAR(ts,'YYYY-MM-DD HH24:MI:SS.ff3'),'YYYY-MM-DD HH24:MI:SS.ff3', 'NLS_DATE_LANGUAGE=American') from ts;
update ts set ts=to_timestamp(TO_CHAR(ts,'YYYY-MM-DD HH24:MI:SS.ff3'),'YYYY-MM-DD HH24:MI:SS.ff3', 'NLS_DATE_LANGUAGE=American');
select TO_CHAR(ts,'YYYY-MM-DD HH24:MI:SS.ff') FROM ts;
您可以使用以下PL/SQL代码来完成这项任务。请注意,在您运行此代码之前,您需要更改表名和字段名称,以符合您的具体情况。
BEGIN
FOR rec IN (SELECT id, b FROM a) LOOP
UPDATE a
SET b = TRUNC(b, 'MI')
WHERE id = rec.id;
END LOOP;
END;
在上面的代码中,我们使用一个FOR循环来遍历a表中的所有记录,并更新每个记录的b字段,将其精度降为3位。我们使用TRUNC函数来完成这项操作,并指定'MI'作为精度值,这表示我们需要保留b字段中的毫秒部分。
在运行代码之前,请务必做好备份,以防止意外错误导致数据损坏。