Você pode tentar
ORDER BY (done asc, aux desc) onde aux é calculado com um CASE para gerar prioridade ou data com base no valor de done (você pode ter que convertê-los para o mesmo tipo para caber na mesma expressão, por exemplo, converter a data para um número de dia inteiro adequado). Por exemplo:
SELECT * FROM tab
ORDER BY done desc,
case done
when 0 then prio
else to_days(thedate)
end desc;