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;