strange TIME behaviour

Started by rihadover 18 years ago8 messagesgeneral
Jump to latest
#1rihad
rihad@mail.ru

Can someone please explain to me why these two give different results?
The idea is to get the number of seconds past 00:00:00, so the second
one is obviously correct.

foo=> select extract(epoch from current_time);
date_part
--------------
42023.026348
(1 row)

foo=> select extract(epoch from cast(current_time as time));
date_part
--------------
60030.824587
(1 row)

Isn't current_time already a time? Why is the cast necessary?

Thanks.

#2Ron Johnson
ron.l.johnson@cox.net
In reply to: rihad (#1)
Re: strange TIME behaviour

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 09/15/07 06:45, rihad wrote:

Can someone please explain to me why these two give different results?
The idea is to get the number of seconds past 00:00:00, so the second
one is obviously correct.

How about:

select extract(hour from current_time)*3600
     + extract(minute from current_time)*60
     + extract(second from current_time);

foo=> select extract(epoch from current_time);
date_part
--------------
42023.026348
(1 row)

foo=> select extract(epoch from cast(current_time as time));
date_part
--------------
60030.824587
(1 row)

Isn't current_time already a time? Why is the cast necessary?

- --
Ron Johnson, Jr.
Jefferson LA USA

Give a man a fish, and he eats for a day.
Hit him with a fish, and he goes away for good!

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)

iD8DBQFG68zOS9HxQb37XmcRAl7KAKDNKaUwMn7mpwYiE1huKd4KvW+T+ACeM8lC
6AZEwlHNUwOucQ3jSWRfqGM=
=0GIE
-----END PGP SIGNATURE-----

#3Michael Fuhr
mike@fuhr.org
In reply to: rihad (#1)
Re: strange TIME behaviour

On Sat, Sep 15, 2007 at 04:45:02PM +0500, rihad wrote:

Can someone please explain to me why these two give different results?
The idea is to get the number of seconds past 00:00:00, so the second
one is obviously correct.

They're both correct.

foo=> select extract(epoch from current_time);
date_part
--------------
42023.026348
(1 row)

current_time is a time with time zone; the above query returns the
number of seconds since 00:00:00 UTC.

foo=> select extract(epoch from cast(current_time as time));
date_part
--------------
60030.824587
(1 row)

By casting current_time to time without time zone you're now getting
the number of seconds since 00:00:00 in your local time zone.

--
Michael Fuhr

#4rihad
rihad@mail.ru
In reply to: Michael Fuhr (#3)
Re: strange TIME behaviour

Michael Fuhr wrote:

On Sat, Sep 15, 2007 at 04:45:02PM +0500, rihad wrote:

Can someone please explain to me why these two give different results?
The idea is to get the number of seconds past 00:00:00, so the second
one is obviously correct.

They're both correct.

foo=> select extract(epoch from current_time);
date_part
--------------
42023.026348
(1 row)

current_time is a time with time zone; the above query returns the
number of seconds since 00:00:00 UTC.

foo=> select extract(epoch from cast(current_time as time));
date_part
--------------
60030.824587
(1 row)

By casting current_time to time without time zone you're now getting
the number of seconds since 00:00:00 in your local time zone.

PostgreSQL seems to default to "time without time zone" when declaring
columns in the table schema. Since all my times and timestamps are in
local time zone, and I'm *only* dealing with local times, should I be
using "time with time zone" instead? When would it make a difference?
Only when comparing/subtracting? Is "with time zone" not the default
because it's slower?

Thanks.

#5Martijn van Oosterhout
kleptog@svana.org
In reply to: rihad (#4)
Re: strange TIME behaviour

On Sat, Sep 15, 2007 at 06:40:38PM +0500, rihad wrote:

PostgreSQL seems to default to "time without time zone" when declaring
columns in the table schema. Since all my times and timestamps are in
local time zone, and I'm *only* dealing with local times, should I be
using "time with time zone" instead? When would it make a difference?
Only when comparing/subtracting? Is "with time zone" not the default
because it's slower?

Historical I beleive. Postgres has four types: timestamp, timestamptz,
time and timetz. Then SQL decreed that TIMESTAMP means WITH TIME ZONE,
ie timestamptz. So now you get the odd situation where:

timestamp == timestamp with time zone == timestamptz
"timestamp" == timestamp without time zone == timestamp
time == time without timezone

Unfortunatly, the backward compatability issues to fixing this are
tricky.

Hope this helps,
--
Martijn van Oosterhout <kleptog@svana.org> http://svana.org/kleptog/

Show quoted text

From each according to his ability. To each according to his ability to litigate.

#6rihad
rihad@mail.ru
In reply to: Michael Fuhr (#3)
Re: strange TIME behaviour

Michael Fuhr wrote:

On Sat, Sep 15, 2007 at 04:45:02PM +0500, rihad wrote:

Can someone please explain to me why these two give different results?
The idea is to get the number of seconds past 00:00:00, so the second
one is obviously correct.

They're both correct.

foo=> select extract(epoch from current_time);
date_part
--------------
42023.026348
(1 row)

current_time is a time with time zone; the above query returns the
number of seconds since 00:00:00 UTC.

foo=> select extract(epoch from cast(current_time as time));
date_part
--------------
60030.824587
(1 row)

By casting current_time to time without time zone you're now getting
the number of seconds since 00:00:00 in your local time zone.

I'm reading this right now:
http://www.postgresql.org/docs/8.2/interactive/datatype-datetime.html
"time with time zone" is not recommended. I'm still unsure if the
timezone issue is at all important when comparing timestamps
(greater/less/etc), or when adding intervals to preset dates? Like
registration_time + interval '2 months';

#7Tom Lane
tgl@sss.pgh.pa.us
In reply to: Martijn van Oosterhout (#5)
Re: strange TIME behaviour

Martijn van Oosterhout <kleptog@svana.org> writes:

Historical I beleive. Postgres has four types: timestamp, timestamptz,
time and timetz. Then SQL decreed that TIMESTAMP means WITH TIME ZONE,
ie timestamptz. So now you get the odd situation where:

timestamp == timestamp with time zone == timestamptz
"timestamp" == timestamp without time zone == timestamp
time == time without timezone

This isn't correct --- timestamp has meant timestamp without time zone
for a long time (since 7.3 I believe). Once upon a time it worked like
you show here, but we changed it specifically because the SQL spec says
that WITHOUT TIME ZONE is the default.

In the case of TIME, that's a good default; in the case of TIMESTAMP
not so much, but we're stuck with it because the spec says so.

regards, tom lane

In reply to: rihad (#6)
Re: strange TIME behaviour

On 15/09/2007 14:53, rihad wrote:

I'm still unsure if the timezone issue is at all important when
comparing timestamps (greater/less/etc), or when adding intervals to
preset dates?

Do you have situations where the interval you're dealing with spans a
change between winter & summer time?

Ray.

---------------------------------------------------------------
Raymond O'Donnell, Director of Music, Galway Cathedral, Ireland
rod@iol.ie
---------------------------------------------------------------