我在下面的查询中,我得到了错误ORA-01840: input value not long enough for date format。该C_DATE列是“日期”数据类型。
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;
您可以“以格式插入日期”。日期具有内部表示形式,它们始终具有所有日期/时间组成部分,然后可以根据需要进行格式化以进行显示。
您作为YYYYMM生成的字符串已通过插入隐式转换为日期,因为这是目标列的数据类型。该隐式转换正在使用您的NLS设置,并且因此期望使用更长的值来匹配NLS日期格式。您的字符串与该隐式格式不匹配,这会导致您看到错误。
如果您只对年份和月份感兴趣,那么可以得到的最接近的结果是在当月的第一天午夜存储trunc:
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连接语法。
to_date
然后,您可以通过c_date查询将其格式化为YYYYMM以便在查询时显示to_char。
c_date
to_char