SQL - Converting 24-hour ("military") time (2145) to "AM/PM time" (9:45 pm)

Posted by CheeseConQueso on Stack Overflow See other posts from Stack Overflow or by CheeseConQueso
Published on 2009-10-15T14:56:00Z Indexed on 2010/04/04 20:13 UTC
Read the original article Hit count: 580

Filed under:
|
|
|

I have 2 fields I'm working with that are stored as smallint military structured times.
Edit I'm running on IBM Informix Dynamic Server Version 10.00.FC9

beg_tm and end_tm

Sample values

beg_tm   545
end_tm   815

beg_tm   1245
end_tm   1330

Sample output

beg_tm   5:45 am
end_tm   8:15 am

beg_tm   12:45 pm
end_tm   1:30 pm

I had this working in Perl, but I'm looking for a way to do it with SQL and case statements.

Is this even possible?


EDIT

Essentially, this formatting has to be used in an ACE report. I couldn't find a way to format it within the output section using simple blocks of

if(beg_tm>=1300) then
beg_tm = vbeg_tm - 1200

Where vbeg_tm is a declared char(4) variable


EDIT This works for hours >=1300 (EXCEPT FOR 2230 !!)

select substr((beg_tm-1200),0,1)||":"||substr((beg_tm-1200),2,2) from mtg_rec where beg_tm>=1300;

This works for hours < 1200 (sometimes.... 10:40 is failing)

select substr((mtg_rec.beg_tm),0,(length(cast(beg_tm as varchar(4)))-2))||":"||(substr((mtg_rec.beg_tm),2,2))||" am" beg_tm from mtg_rec where mtg_no = 1;


EDIT
Variation of casting syntax used in Jonathan Leffler's expression approach

SELECT  beg_tm,
    	cast((MOD(beg_tm/100 + 11, 12) + 1) as VARCHAR(2)) || ':' ||
    	SUBSTRING(cast((MOD(beg_tm, 100) + 100) as CHAR(3)) FROM 2) ||
        SUBSTRING(' am pm' FROM (MOD(cast((beg_tm/1200) as INT), 2) * 3) + 1 FOR 3),
    	end_tm,
    	cast((MOD(end_tm/100 + 11, 12) + 1) as VARCHAR(2)) || ':' ||
    	SUBSTRING(cast((MOD(end_tm, 100) + 100) as CHAR(3)) FROM 2) ||
        SUBSTRING(' am pm' FROM (MOD(cast((end_tm/1200) as INT), 2) * 3) + 1 FOR 3)
      FROM mtg_rec
      where mtg_no = 39;

© Stack Overflow or respective owner

Related posts about sql

Related posts about formatting