Non puoi inserire una data "con un formato". Le date hanno una rappresentazione interna, hanno sempre tutti i componenti di data/ora e possono quindi essere formattate per la visualizzazione come preferisci.
La stringa che stai generando come AAAAMM viene convertita implicitamente in una data dall'inserimento, poiché questo è il tipo di dati della colonna di destinazione. Quella conversione implicita utilizza le tue impostazioni NLS e da ciò si aspetta un valore più lungo che corrisponda al formato della data NLS. La tua stringa non corrisponde a quel formato implicito, che sta causando l'errore che stai vedendo.
Se sei interessato solo all'anno e al mese, il più vicino che puoi ottenere è memorizzare la mezzanotte del primo del mese, che puoi ottenere con 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;
Ho anche rimosso l'extra to_date
chiamata. Dovresti considerare di passare anche alla sintassi di join ANSI.
Puoi quindi formattare c_date
come AAAAMM da visualizzare quando lo richiedi, se è quello che ti serve, tramite to_char
.