首页 > 解决方案 > 小时必须在 1 到 12 之间 - sql 错误或 ORA-01830:日期格式图片在转换整个输入字符串之前结束

问题描述

我有一列时间戳以 20-02-18 03:50:58.347000000 PM 格式存储。这些时间戳存储在多行中,因此我想通过使用随机数生成器仅更新此列中的毫秒数,以便每一行都是唯一的。我尝试使用以下查询来更新时间

UPDATE table 
   SET field = TO_TIMESTAMP('18-01-18 02:23:27.265000050 PM'|| ' ' || TO_TIMESTAMP(field, 'HH:MI:SS.FF'),'DD-MM-YY HH:MI:SS.FF')
where objid = XXX;

我收到一个错误 - ORA-01849:小时必须在 1 到 12 之间

如果我将查询更改为以下格式 - 用于更新时间的查询

UPDATE table 
   SET field = TO_TIMESTAMP('18-01-18 02:23:27.265000050 PM'|| ' ' || TO_TIMESTAMP(field, 'hh12:MI:SS.FF'),'DD-MM-YY hh12:MI:SS.FF')
where objid = XXX;

我收到以下错误 - ORA-01830:日期格式图片在转换整个输入字符串之前结束。任何人都可以检查一下吗

标签: oracleoracle11gdate-arithmetic

解决方案


不要带着日期面具到处乱搞。只需使用 INTERVAL 添加毫秒:

update t23
set ts = ts + interval '0.001' second * dbms_random.value(0,999)

这是关于 db<>fiddle 的演示


使用随机数生成器,以便每一行都是唯一的。

不保证。随机序列仍然可以包含重复的数字。但是,如果您每秒只有几个时间戳,那么您不太可能会遇到任何冲突。冲突的可能性随着每秒时间戳的数量而增加。因此,如果唯一性是练习的对象,那么这是错误的方法。您需要一个不同的密钥来唯一标识您的记录(可能是一个技术密钥,例如序列或标识列)。


推荐阅读