一尘不染

ORA-01840:输入值不足以使用Select在Oracle Insert中显示日期格式

sql

我在下面的查询中,我得到了错误ORA-01840: input value not long enough for date format。该C_DATE列是“日期”数据类型。

INSERT INTO CS_LOG(NAME, ID, C_DATE)
Select MAX(ML.NAME), ML.ID, TO_CHAR(CHK_DATE,'YYYYMM')
from D_ID ML,
     CS_LOG MD
WHERE ML.NAME != MD.NAME
  and ML.ID != MD.ID
  and MD.C_DATE = LAST_DAY(to_date(sysdate,'YYYYMMDD'))
GROUP BY ML.ID, C_DATE;

阅读 883

收藏
2021-03-08

共1个答案

一尘不染

您可以“以格式插入日期”。日期具有内部表示形式,它们始终具有所有日期/时间组成部分,然后可以根据需要进行格式化以进行显示。

您作为YYYYMM生成的字符串已通过插入隐式转换为日期,因为这是目标列的数据类型。该隐式转换正在使用您的NLS设置,并且因此期望使用更长的值来匹配NLS日期格式。您的字符串与该隐式格式不匹配,这会导致您看到错误。

如果您只对年份和月份感兴趣,那么可以得到的最接近的结果是在当月的第一天午夜存储trunc

INSERT INTO CS_LOG(NAME, ID, C_DATE)
Select MAX(ML.NAME), ML.ID, TRUNC(CHK_DATE,'MM')
from D_ID ML,CS_LOG MD
WHERE ML.NAME != MD.NAME and ML.ID != MD.ID
and MD.C_DATE = LAST_DAY(sysdate)
GROUP BY ML.ID,C_DATE;

我也删除了多余的to_date电话。您也应该考虑切换到ANSI连接语法。

然后,您可以通过c_date查询将其格式化为YYYYMM以便在查询时显示to_char

2021-03-08