【问题标题】:hour must be between 1 and 12 - sql error or ORA-01830: date format picture ends before converting entire input string小时必须在 1 到 12 之间 - sql 错误或 ORA-01830:日期格式图片在转换整个输入字符串之前结束
【发布时间】:2020-01-16 23:08:29
【问题描述】:

我有一列时间戳以 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 之间

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

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: 日期格式图片在转换整个输入字符串之前结束。有人可以检查一下吗

【问题讨论】:

  • 执行此操作时出现错误 ORA-01830:日期格式图片在转换整个输入字符串之前结束
  • 您是否真的将时间戳值存储为VARCHAR2?如果不是,为什么要在已经是 TIMESTAMP 的值上运行 TO_TIMESTAMP
  • 为什么你认为随机数会产生唯一值?
  • field的数据类型是什么?是毫秒数吗?
  • 嗨 Wenfried,是的,它已经以时间戳格式存储,我想使用随机数,因为它会为每一行提供不同的值

标签: oracle oracle11g date-arithmetic


【解决方案1】:

不要随意使用日期掩码。只需使用 INTERVAL 添加毫秒:

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

这里是a demo on db<>fiddle


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

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

【讨论】:

  • 这实际上是目前更好的解决方案。谢谢您的帮助。堆栈溢出很棒,我每次都在学习新事物。
猜你喜欢
  • 2019-04-25
  • 2010-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-20
  • 2020-06-24
相关资源
最近更新 更多