01840:输入值不够长,无法用于sql oracle的日期格式

qnakjoqk  于 2021-08-01  发布在  Java
关注(0)|答案(1)|浏览(515)

我试图使用下面的代码更新表,但得到错误sql错误:ora-01840:输入值不够长,无法使用日期格式,因为\u dt\u wid上的\u是一个数字列,带有类似于“20191231”的示例记录,x\u need\u上的预期结果是“31-dec-19”。x\u need\u by\u dt是一个日期列。事先谢谢你的帮助。

  1. update ADW12_DW.W_PURCH_COST_F T
  2. set (
  3. T.X_NEED_BY_DT
  4. ) =
  5. (
  6. select
  7. TO_DATE(DUE_ON_DT_WID,'YYYYMMDD')
  8. from ADW12_DW.I$_1200778522_6 S
  9. where T.DATASOURCE_NUM_ID =S.DATASOURCE_NUM_ID
  10. and T.INTEGRATION_ID =S.INTEGRATION_ID
  11. )
  12. where (DATASOURCE_NUM_ID, INTEGRATION_ID)
  13. in (
  14. select DATASOURCE_NUM_ID,
  15. INTEGRATION_ID
  16. from ADW12_DW.I$_1200778522_6
  17. where IND_UPDATE = 'U'
  18. )
xfb7svmp

xfb7svmp1#

你的数据格式肯定有问题 YYYYMMDD 必须有8作为数据长度(因为在您的数据中,年份将排在第一位)。
请使用以下查询查找问题数据并进行更正。

  1. select * from ADW12_DW.I$_1200778522_6 where length(DUE_ON_DT_WID) <> 8

我想你有这样的数据 20191231 还有 191231 . 你认为他们是一样的吗?即 '31-DEC-19' 那你需要用 CASE..WHEN 以及 RR/YYYY 设置年份格式如下:

  1. CASE WHEN LENGTH(DUE_ON_DT_WID) = 6 THEN
  2. TO_DATE(DUE_ON_DT_WID,'RRMMDD')
  3. WHEN LENGTH(DUE_ON_DT_WID) = 8 THEN
  4. TO_DATE(DUE_ON_DT_WID,'YYYYMMDD')
  5. END

如果您使用的是oracle 12.2或更高版本,则可以使用 ON CONVERSION ERROR 合同条款 TO_DATE 当从列到日期的转换失败时,按以下方式设置默认值:

  1. TO_DATE(DUE_ON_DT_WID DEFAULT '20010101' ON CONVERSION ERROR, 'YYYYMMDD' )

相关问题