Interesting and good to know! I come from a functional background, and when I encountered this did not know it was a 'standard' way to do things. At the time I was much stronger in Crystal than straight TSQL, and did parse & concatonate as you mention. Ended up with the below to get user friendly times. Obviously this only worked because the value was a time, not a duration. Had it been a duration I would have been one of those you mention who put something together that "fell down" for anything over 24 hours. Thanks for an improved way to approach this!!!
select {tblScheduleDetail.StartTime}
Case 0:
"12:00 AM"
Case 1 to 999:
"12:0"&left(cstr({tblScheduleDetail.StartTime}),1)
&" AM"
Case 1000 to 9999:
"12:"&left(cstr({tblScheduleDetail.StartTime}),1)& mid(cstr({tblScheduleDetail.StartTime}),3,1)
&" AM"
Case 10000 to 99999:
left(cstr({tblScheduleDetail.StartTime}),1)&":"& mid(cstr({tblScheduleDetail.StartTime}),2,1)&
mid(cstr({tblScheduleDetail.StartTime}),4,1)&" AM"
case 100000 to 119999:
left(cstr({tblScheduleDetail.StartTime}),2)&":"& mid(cstr({tblScheduleDetail.StartTime}),3,1)&
mid(cstr({tblScheduleDetail.StartTime}),5,1)&" AM"
case 120000 to 240000:
left(cstr({tblScheduleDetail.StartTime}),2)&":"& mid(cstr({tblScheduleDetail.StartTime}),3,1)&
mid(cstr({tblScheduleDetail.StartTime}),5,1)&" PM"
;;