Bonjour,
le fait que l'ordre ne soit pas 'Logique' est que

extract(month FROM heures.ptdate)|| '-' || extract(year FROM heures.ptdate) AS MOIS fourni un varchar donc le tri est alphanumérique...