And*_*rew 2 sql oracle date sql-insert
我有以下查询,其中出现错误为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;
Run Code Online (Sandbox Code Playgroud)
您不能插入“带有格式”的日期。日期具有内部表示,它们始终具有所有日期/时间组件,然后可以根据需要进行格式化以进行显示。
您生成的 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;
Run Code Online (Sandbox Code Playgroud)
我也删除了额外的to_date电话。您也应该考虑切换到 ANSI 连接语法。
然后,您可以c_date在查询时将其格式化为 YYYYMM 以进行显示(如果这是您需要的),请通过to_char.