Re: Timestamp output

From: Andreas Joseph Krogh <andreak(at)officenet(dot)no>
To: pgsql-sql(at)postgresql(dot)org
Subject: Re: Timestamp output
Date: 2002-02-26 17:56:00
Message-ID: 20020226175601.0944123FA1@dell-laptop01.officenet.no
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-jdbc pgsql-sql

On Tuesday 26 February 2002 16:55, Tom Lane wrote:
> 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.

It would be nice if the JDBC driver reflected the changes as it chokes on:
Bad Timestamp Format at 23 in 2002-02-26 18:32:54.83294+01

--
Andreas Joseph Krogh (Senior Software Developer) <andreak(at)officenet(dot)no>
A hen is an egg's way of making another egg.

In response to

Responses

Browse pgsql-jdbc by date

  From Date Subject
Next Message Benoit Menendez 2002-02-26 18:36:42 Blob support...
Previous Message Tom Lane 2002-02-26 15:55:41 Re: Timestamp output

Browse pgsql-sql by date

  From Date Subject
Next Message Frank Bax 2002-02-26 19:38:34 Re: [CHALLANGE] Add seconds to a date
Previous Message Christof Glaser 2002-02-26 17:26:34 Re: Removing duplicates