select case fmt
when '15 min' then (date_trunc('hour', val) + date_part('minute', val)::int / 15 * interval '15 min') when '30 min' then (date_trunc('hour', val) + date_part('minute', val)::int / 30 * interval '30 min') when '5 min' then (date_trunc('hour', val) + date_part('minute', val)::int / 5 * interval '5 min') else date_trunc(fmt, val) end;