Du kan inte infoga ett datum "med ett format". Datum har en intern representation, de har alltid alla datum/tidskomponenter och kan sedan formateras för visning hur du vill.
Strängen du genererar som ÅÅÅÅMM konverteras implicit till ett datum av infogningen, eftersom det är målkolumnens datatyp. Den implicita konverteringen använder dina NLS-inställningar, och från det förväntas ett längre värde som matchar NLS-datumformatet. Din sträng matchar inte det implicita formatet, vilket orsakar felet du ser.
Om du bara är intresserad av år och månad är det närmaste du kan komma att lagra midnatt den första i månaden, vilket du kan få med 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;
Jag har också tagit bort den extra to_date
ringa upp. Du bör också överväga att byta till ANSI join-syntax.
Du kan sedan formatera c_date
som ÅÅÅÅMM för visning när du frågar det, om det är vad du behöver, via to_char
.