Re: Timestamp output

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: Christopher Kings-Lynne <chriskl(at)familyhealth(dot)com(dot)au>
Cc: Matteo Beccati <m(dot)beccati(at)crpsoftware(dot)it>, pgsql-sql(at)postgresql(dot)org
Subject: Re: Timestamp output
Date: 2002-02-26 15:55:41
Message-ID: 29989.1014738941@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-jdbc pgsql-sql

Christopher Kings-Lynne <chriskl(at)familyhealth(dot)com(dot)au> writes:
> Although I know of this problem, I would also be interested in the fix.
> I know that you can declare a column of type timestamp(0) to get the old
> format, but how do you change an existing column?

Officially, it's not supported. Unofficially, you can always hack
pg_attribute.atttypmod, which is where precision info is stored.
Observe the following example:

regression=# create table foo (f1 timestamp, f2 timestamp(0));
CREATE
regression=# \d foo
Table "foo"
Column | Type | Modifiers
--------+-----------------------------+-----------
f1 | timestamp with time zone |
f2 | timestamp(0) with time zone |

regression=# select * from pg_attribute where attrelid =
regression-# (select oid from pg_class where relname = 'foo')
regression-# and attnum > 0;
attrelid | attname | atttypid | attstattarget | attlen | attnum | attndims | attcacheoff | atttypmod | attbyval | attstorage | attisset | attalign | attnotnull | atthasdef
----------+---------+----------+---------------+--------+--------+----------+-------------+-----------+----------+------------+----------+----------+------------+-----------
146285 | f1 | 1184 | 10 | 8 | 1 | 0 | -1 | -1 | f | p | f | d | f | f
146285 | f2 | 1184 | 10 | 8 | 2 | 0 | -1 | 0 | f | p | f | d | f | f
(2 rows)

Comparing the atttypmod values, we see that -1 implies "no precision
restriction" and 0 means "zero fractional digits" (note that this
applies to timestamp only, other datatypes have their own conventions).
Now that we know where the gold is hidden:

regression=# update pg_attribute set atttypmod = 0 where
regression-# attrelid = (select oid from pg_class where relname = 'foo')
regression-# and attnum = 1;
UPDATE 1
regression=# \d foo
Table "foo"
Column | Type | Modifiers
--------+-----------------------------+-----------
f1 | timestamp(0) with time zone |
f2 | timestamp(0) with time zone |

This does not change the data already in the column, only cause a
rounding adjustment to be applied during future inserts and updates.

If you've already got fractional timestamps in the table, you could
now fix 'em all with something like

update foo set f1 = f1;

BTW: if what you're unhappy about is not a readout from a table but
just the result of "select now()", try "select current_timestamp(0)"
instead.

regards, tom lane

In response to

Responses

Browse pgsql-jdbc by date

  From Date Subject
Next Message Andreas Joseph Krogh 2002-02-26 17:56:00 Re: Timestamp output
Previous Message Tom Lane 2002-02-26 15:25:49 Re: Strange Error

Browse pgsql-sql by date

  From Date Subject
Next Message Jeff Self 2002-02-26 16:19:36 Re: Removing duplicates
Previous Message Andrew Perrin 2002-02-26 15:44:53 Re: Removing duplicates