ORA-01840:使用Select的Oracle Insert中的日期格式输入值不够长

时间:2018-01-17 08:35:39

标签: sql oracle date sql-insert

我在下面查询我的错误为ORA-01840: input value not long enough for date formatC_DATE列是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;

2 个答案:

答案 0 :(得分:3)

您无法插入带格式的日期'。日期具有内部表示,它们始终具有所有日期/时间组件,然后可以根据需要进行格式化显示。

您生成的字符串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_dateto_char格式化为YYYYMM,以便在您查询时将其显示(如果您需要)。

答案 1 :(得分:1)

您正在尝试插入日期,varchar是YYYYMM 你有错误是正常的。

尝试插入实际日期,而不仅仅是月份和年份