Du kan ikke indsætte en dato 'med et format'. Datoer har en intern repræsentation, de har altid alle dato/tidskomponenter og kan derefter formateres til visning, som du vil.
Den streng, du genererer som ÅÅÅÅMM, bliver implicit konverteret til en dato af indsættelsen, da det er målkolonnens datatype. Den implicitte konvertering bruger dine NLS-indstillinger, og derfra forventes en længere værdi, der matcher NLS-datoformatet. Din streng matcher ikke det implicitte format, som forårsager den fejl, du ser.
Hvis du kun er interesseret i året og måneden, så er det tætteste du kan komme at gemme midnat den første i måneden, hvilket du kan komme 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;
Jeg har også fjernet den ekstra to_date
opkald. Du bør også overveje at skifte til ANSI join-syntaks.
Du kan derefter formatere c_date
som ÅÅÅÅMM til visning, når du forespørger på det, hvis det er det, du har brug for, via to_char
.