TIMESTAMP comparison problem

Lists: pgsql-sql
From: Stuart Brooks <stuartb(at)cat(dot)co(dot)za>
To: pgsql-sql(at)postgresql(dot)org
Subject: TIMESTAMP comparison problem
Date: 2008-01-22 08:05:04
Message-ID: 4795A3B0.3010505@cat.co.za
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-sql

I have a problem in comparing a TIMESTAMP field with a timestamp
literal. I presume it is to do with the floating point representation of
the timestamp but I was wondering if there is an easy work around
without having to recompile postgres to use integer datetimes.

Basically if I issue a "SELECT * FROM T WHERE tstamp>'xxxxx';" I get
xxxxx as my first field.
If I reduce the precision to 3 for the timestamps it appears to work
although it makes me nervous.

I am running postgresql 8.2.5 on NetBSD 3.

Should I just recompile to use integer datetimes? I would like to have
at least microsecond precision.

Thanks
Stuart

Table definition:
------------------------------------------------

db=> \d+ Transactions;
Table "test.transactions"
Column | Type | Modifiers transaction_key | bigint | not null default nextval('transactions_transaction_key_seq'::regclass) |
time | timestamp(6) without time zone | not null

Indexes:
"transactions_pkey" PRIMARY KEY, btree (transaction_key)
"transactions_time_index" btree ("time", transaction_key)
Has OIDs: no

Table contents:
------------------------------------------------

db=> select transaction_key,time from Transactions;
transaction_key | time
-----------------+----------------------------
1 | 2008-01-22 09:33:34.681693
2 | 2008-01-22 09:33:34.98421
3 | 2008-01-22 09:33:36.270745
4 | 2008-01-22 09:33:38.573363
5 | 2008-01-22 09:33:38.496988
6 | 2008-01-22 09:33:39.995707
7 | 2008-01-22 09:33:40.111784
8 | 2008-01-22 09:33:41.415505
9 | 2008-01-22 09:33:42.328298
10 | 2008-01-22 09:33:42.025126
11 | 2008-01-22 09:33:44.802205
12 | 2008-01-22 09:33:45.257675
13 | 2008-01-22 09:33:46.746349
14 | 2008-01-22 09:33:46.513937
15 | 2008-01-22 09:33:46.735079
16 | 2008-01-22 09:33:47.528806
17 | 2008-01-22 09:33:49.20255
18 | 2008-01-22 09:33:51.724916
19 | 2008-01-22 09:33:52.550102
20 | 2008-01-22 09:33:54.698312
(20 rows)

Query with problem:
------------------------------------------------

metadb=> select transaction_key,time from Transactions where time>'2008-01-22 09:33:46.746349';
transaction_key | time
-----------------+----------------------------
13 | 2008-01-22 09:33:46.746349 *** THIS SHOULDN'T BE HERE ****
16 | 2008-01-22 09:33:47.528806
17 | 2008-01-22 09:33:49.20255
18 | 2008-01-22 09:33:51.724916
19 | 2008-01-22 09:33:52.550102
20 | 2008-01-22 09:33:54.698312
(6 rows)


From: Michael Glaesemann <grzm(at)seespotcode(dot)net>
To: Stuart Brooks <stuartb(at)cat(dot)co(dot)za>
Cc: pgsql-sql(at)postgresql(dot)org
Subject: Re: TIMESTAMP comparison problem
Date: 2008-01-22 12:42:20
Message-ID: 794E6600-42A8-41A2-822D-080E19F9F0CC@seespotcode.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-sql


On Jan 22, 2008, at 3:05 , Stuart Brooks wrote:

> If I reduce the precision to 3 for the timestamps it appears to
> work although it makes me nervous.

With float timestamps, you're fooling yourself if you think those
numbers past the decimal are reliable.

> Should I just recompile to use integer datetimes? I would like to
> have at least microsecond precision.

Well, you can't get better than microsecond precision with timestamps
in Postgres. And the only way you can rely on that level of precision
is to compile with --enable-integer-datetimes.

Michael Glaesemann
grzm seespotcode net


From: Stuart Brooks <stuartb(at)cat(dot)co(dot)za>
To: Michael Glaesemann <grzm(at)seespotcode(dot)net>
Cc: pgsql-sql(at)postgresql(dot)org
Subject: Re: TIMESTAMP comparison problem
Date: 2008-01-22 12:52:13
Message-ID: 4795E6FD.4080107@cat.co.za
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-sql


>> If I reduce the precision to 3 for the timestamps it appears to work
>> although it makes me nervous.
>
> With float timestamps, you're fooling yourself if you think those
> numbers past the decimal are reliable.
>
>> Should I just recompile to use integer datetimes? I would like to
>> have at least microsecond precision.
>
> Well, you can't get better than microsecond precision with timestamps
> in Postgres. And the only way you can rely on that level of precision
> is to compile with --enable-integer-datetimes.
>
> Michael Glaesemann
I thought that might be the case, thanks for the help,

Stuart


From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: Michael Glaesemann <grzm(at)seespotcode(dot)net>
Cc: Stuart Brooks <stuartb(at)cat(dot)co(dot)za>, pgsql-sql(at)postgresql(dot)org
Subject: Re: TIMESTAMP comparison problem
Date: 2008-01-22 17:13:33
Message-ID: 3623.1201022013@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-sql

Michael Glaesemann <grzm(at)seespotcode(dot)net> writes:
> Well, you can't get better than microsecond precision with timestamps
> in Postgres. And the only way you can rely on that level of precision
> is to compile with --enable-integer-datetimes.

There is more precision in there, but the output routine won't show it
to you. I think the real issue in Stuart's example is that what's being
shown as .746349 is actually .7463494 or something like that. Doing an
extract(epoch) on the stored values might be instructive.

If you don't want to deal with these sorts of issues then yeah, you want
integer timestamps.

regards, tom lane