问题描述
目前,我有一个具有数据类型时间戳 (6) 的列,但现在我需要将其更改为时间戳 (0)。
因为我们不能降低精度,
ORA-30082: 要修改的datetime/interval列必须为空,以降低小数秒或前导字段精度
所以,我遵循这个过程:
1.将数据复制到临时表
2.使用新的数据类型删除并重新创建表
3.使用此特定列的以下逻辑将数据从临时表加载到实际表
TO_CHAR (更新 _dttm,'yyyy-MON-DD HH24:MI:SS')
但是我得到了 “ORA-01843: 不是一个有效的月份”
但是当我写的时候从表1中选择UPDATE_DTTM,TO_CHAR (UPDATE_DTTM,'yyyy-MON-DD HH24:MI:SS');
没问题。数据正在返回。
更改时间戳之前的数据 (6)
1 01-FEB-17下午04.39.54.000000000
2017年1月20日下午05.12.20.000000000
2009年1月3日晚上08点56.54.000000000
更改后的数据 :( 时间戳 (0)
1 01-FEB-17 04.39.54
2 2017年1月20日05.12.20
3 09年1月8日8.56.54
因为我们不能降低精度,
ORA-30082: 要修改的datetime/interval列必须为空,以降低小数秒或前导字段精度
所以,我遵循这个过程:
1.将数据复制到临时表
2.使用新的数据类型删除并重新创建表
3.使用此特定列的以下逻辑将数据从临时表加载到实际表
TO_CHAR (更新 _dttm,'yyyy-MON-DD HH24:MI:SS')
但是我得到了 “ORA-01843: 不是一个有效的月份”
但是当我写的时候从表1中选择UPDATE_DTTM,TO_CHAR (UPDATE_DTTM,'yyyy-MON-DD HH24:MI:SS');
没问题。数据正在返回。
更改时间戳之前的数据 (6)
1 01-FEB-17下午04.39.54.000000000
2017年1月20日下午05.12.20.000000000
2009年1月3日晚上08点56.54.000000000
更改后的数据 :( 时间戳 (0)
1 01-FEB-17 04.39.54
2 2017年1月20日05.12.20
3 09年1月8日8.56.54
专家解答
稍等一下。您正在通过将数据转换为 _char来插入时间戳?!
你中了隐式转换大奖!
数据库将必须将其转换回时间戳。
所以你真正拥有的是:
而且,因为它是隐式的,所以您没有指定格式掩码。所以它会使用你的客户端的NLS设置。不好。
您可以通过将值强制转换为时间戳 (0) 来避免这种情况:
你中了隐式转换大奖!
数据库将必须将其转换回时间戳。
所以你真正拥有的是:
to_timestamp ( TO_CHAR (UPDATE_DTTM, 'YYYY-MON-DD HH24:MI:SS') )
而且,因为它是隐式的,所以您没有指定格式掩码。所以它会使用你的客户端的NLS设置。不好。
您可以通过将值强制转换为时间戳 (0) 来避免这种情况:
select systimestamp, cast( systimestamp as timestamp(0) ) from dual; SYSTIMESTAMP CAST(SYSTIMESTAMPASTIMESTAMP(0)) 21-JUN-2018 03:25:28.914751000 -07 21-JUN-2018 03:25:29.000000000
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




