Ну, я обнаружил, что этот код дает желаемый результат:
select CASE
WHEN TRUNC(cr.callend/86400)=1 THEN TRUNC(cr.callend/86400)||' day '
WHEN TRUNC(cr.callend/86400)>1 THEN TRUNC(cr.callend/86400)||' days '
ELSE ''
END||TRUNC(MOD(cr.callend,86400)/3600)||':'
||TRUNC(MOD(MOD(cr.callend,86400),3600)/60)
||':'||MOD(MOD(MOD(cr.callend,86400),3600),60) as dur
from callrecord cr
Хотя выглядит не очень элегантно, этот SQL работает даже быстрее, чем в первом примере.