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

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

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

update      ADW12_DW.W_PURCH_COST_F T
set     (
    T.X_NEED_BY_DT
    ) =
        (
        select  
        TO_DATE(DUE_ON_DT_WID,'YYYYMMDD')
        from    ADW12_DW.I$_1200778522_6 S
        where   T.DATASOURCE_NUM_ID =S.DATASOURCE_NUM_ID
        and T.INTEGRATION_ID    =S.INTEGRATION_ID
             )

where   (DATASOURCE_NUM_ID, INTEGRATION_ID)
    in  (
        select  DATASOURCE_NUM_ID,
            INTEGRATION_ID
        from    ADW12_DW.I$_1200778522_6
        where   IND_UPDATE = 'U'
        )
xfb7svmp

xfb7svmp1#

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

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

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

CASE WHEN LENGTH(DUE_ON_DT_WID) = 6 THEN 
       TO_DATE(DUE_ON_DT_WID,'RRMMDD')
     WHEN LENGTH(DUE_ON_DT_WID) = 8 THEN
       TO_DATE(DUE_ON_DT_WID,'YYYYMMDD')
END

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

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

相关问题