Ok, I just went through a rather painful exercise, and hopefully, this will help others avoid these issues.
APEX allows for arbitrarily complex calculations in interactive reports, which is cool. But there are some issues which are not immediately obvious. The two that just got me are that a) it doesn't support tab characters in a calculation, so if you're editing a multi-line calculation in an outside editor, make sure you replace any tabs with spaces, and b) it throws a fit if you decode a value to an empty string, even if that value is part of a larger concatenation. Luckily, I was able to put a space into my string without ruining my formatting, but it took me a while to figure out what the issue was.
For the curious, here's the calculation I ended up with:
substr(DV,1,instr(DV,':')-1) ||decode(substr(DV,instr(DV,':')+1,instr (DV,':',1,2)-instr(DV,':')-1),'N',' Minute','H',' Hour','D',' Day','M',' Month','?') || decode(substr(DV,1,instr(DV,':')-1),'1',' ','s ') || 'from ' || decode(substr(DV,length (DV)),'S','Start','C','Completion','?')
Yes, that's column DV. Most of the columns are hidden, but they're there, if anyone wants to turn them on. This is just a demonstration application, thankfully, though it may be turned into a real one some day.
Bonus points to anyone who can figure out from the calculation what it is that I'm working on–as a hint, this will take knowledge of more Oracle products than just APEX.