Thread: rounding timestamps
Hello (Sorry about reposting, but I'm still not arriving to any good solution for this one) I need to output a timestamp attribute formatted to fixed-width, no spaces nor separators, something like test=> select to_char(timestamp '2003-10-24 15:30:59.999', 'YYYYMMDDHH24MISS'); to_char ---------------- 20031024153059 (1 row) But my problem is that to_char truncates the fractional seconds, and I need to round the value to the nearest integer second. In the above, I would need the output rounded to 15:31:00, which is just a millisecond away, for example. But I couldn't find a function to round a timestamp. Are there any workaround? thanks cl.
On Mon, Nov 24, 2003 at 12:15:54AM -0300, Claudio Lapidus wrote: > But my problem is that to_char truncates the fractional seconds, and I need > to round the value to the nearest integer second. In the above, I would need > the output rounded to 15:31:00, which is just a millisecond away, for > example. But I couldn't find a function to round a timestamp. Are there any > workaround? Maybe you can try with EXTRACT(epoch FROM timestamp), rounding that, and then converting back to a timestamp through abstime. Ugly though ... -- Alvaro Herrera (<alvherre[a]dcc.uchile.cl>) "Hoy es el primer día del resto de mi vida"
Claudio Lapidus wrote: > test=> select to_char(timestamp '2003-10-24 15:30:59.999', > 'YYYYMMDDHH24MISS'); > to_char > ---------------- > 20031024153059 > (1 row) > > But my problem is that to_char truncates the fractional seconds, and I need > to round the value to the nearest integer second. In the above, I would need > the output rounded to 15:31:00, which is just a millisecond away, for > example. But I couldn't find a function to round a timestamp. Are there any > workaround? Is this what you wanted? regression=# select to_char(timestamp(0) '2003-10-24 15:30:59.999','YYYYMMDDHH24MISS'); to_char ---------------- 20031024153100 (1 row) See: http://www.postgresql.org/docs/current/static/datatype-datetime.html HTH, Joe
Joe Conway wrote: > Is this what you wanted? > > regression=# select to_char(timestamp(0) '2003-10-24 > 15:30:59.999','YYYYMMDDHH24MISS'); > to_char > ---------------- > 20031024153100 > (1 row) Yes! Exactly! > > See: > http://www.postgresql.org/docs/current/static/datatype-datetime.html Shame on me. I've must read that page more times than I can remember. I never realized that I could use the precision qualifier to do a cast (and round): comp_20031117=> create table ts (ts timestamp without time zone); CREATE TABLE comp_20031117=> insert into ts values ('2003-10-24 15:30:59.999'); INSERT 406299 1 comp_20031117=> select * from ts; ts ------------------------- 2003-10-24 15:30:59.999 (1 row) comp_20031117=> select to_char (ts ::timestamp(0), 'YYYYMMDDHH24MISS') from ts; to_char ---------------- 20031024153100 (1 row) thank you very much Joe cl. PS. Alvaro, your solution was what I was implementing already, but yes it's ugly, that's why I gave it a second round. Thanks anyway.