Thread: New function: epoch_to_timestamp...

New function: epoch_to_timestamp...

From
David Fetter
Date:
Kind people,

After discussing this w/Josh yesterday, I'd like to propose a new
function for date_time.  Here's the Pl/PgSQL version, warts 'n' all.

CREATE OR REPLACE FUNCTION epoch_to_timestamp (INTEGER)
RETURNS TIMESTAMP AS '
DECLARE   the_sql  TEXT;   the_record RECORD;   the_time TIMESTAMP;
BEGIN   the_sql := ''SELECT ''''January 1 1970''''::timestamp + ''''''             || $1            || ''
seconds''''::intervalAS "foo"'';   FOR the_record IN EXECUTE the_sql LOOP       the_time := the_record.foo;   END LOOP;
 RETURN the_time;
 
END;
' LANGUAGE 'plpgsql';

My C skills (Hello, world!) aren't up to doing it that way, although
that's probably The Right Thing(TM).  Is there a reasonable way to add
an optional param or two to mark time zones, or should that just the
application programmer's hassle?

TIA for any feedback :)

Cheers,
D
-- 
David Fetter david@fetter.org http://fetter.org/
phone: +1 510 893 6100    cell: +1 415 235 3778


Re: New function: epoch_to_timestamp...

From
"Christopher Kings-Lynne"
Date:
You can actually kinda hack this by going:

SELECT 41235125::abstime::timestamp;

Where 41235125 is a unix epoch.

Cheers,

Chris

----- Original Message ----- 
From: "David Fetter" <david@fetter.org>
To: "PG Hackers" <pgsql-hackers@postgresql.org>
Sent: Friday, August 15, 2003 4:46 AM
Subject: [HACKERS] New function: epoch_to_timestamp...


> Kind people,
> 
> After discussing this w/Josh yesterday, I'd like to propose a new
> function for date_time.  Here's the Pl/PgSQL version, warts 'n' all.
> 
> CREATE OR REPLACE FUNCTION epoch_to_timestamp (INTEGER)
> RETURNS TIMESTAMP AS '
> DECLARE
>     the_sql  TEXT;
>     the_record RECORD;
>     the_time TIMESTAMP;
> BEGIN
>     the_sql := ''SELECT ''''January 1 1970''''::timestamp + '''''' 
>              || $1
>              || '' seconds''''::interval AS "foo"'';
>     FOR the_record IN EXECUTE the_sql LOOP
>         the_time := the_record.foo;
>     END LOOP;
>     RETURN the_time;
> END;
> ' LANGUAGE 'plpgsql';
> 
> My C skills (Hello, world!) aren't up to doing it that way, although
> that's probably The Right Thing(TM).  Is there a reasonable way to add
> an optional param or two to mark time zones, or should that just the
> application programmer's hassle?
> 
> TIA for any feedback :)
> 
> Cheers,
> D
> -- 
> David Fetter david@fetter.org http://fetter.org/
> phone: +1 510 893 6100    cell: +1 415 235 3778
> 
> ---------------------------(end of broadcast)---------------------------
> TIP 5: Have you checked our extensive FAQ?
> 
>                http://www.postgresql.org/docs/faqs/FAQ.html
> 


Re: New function: epoch_to_timestamp...

From
Tom Lane
Date:
David Fetter <david@fetter.org> writes:
> Is there a reasonable way to add
> an optional param or two to mark time zones, or should that just the
> application programmer's hassle?

The return type should be timestamptz, which makes the transformation
timezone-independent.
        regards, tom lane


Re: New function: epoch_to_timestamp...

From
David Fetter
Date:
On Fri, Aug 15, 2003 at 06:57:24AM -0400, Tom Lane wrote:
> David Fetter <david@fetter.org> writes:
> > Is there a reasonable way to add an optional param or two to mark
> > time zones, or should that just the application programmer's
> > hassle?

> The return type should be timestamptz, which makes the
> transformation timezone-independent.

Do you mean the default one should read as follows, or that the
default one should take params (integer, output_timezone,
input_timezone), or...?

CREATE OR REPLACE FUNCTION epoch_to_timestampz (INTEGER)
RETURNS TIMESTAMPZ AS '
DECLARE   the_sql  TEXT;   the_record RECORD;   the_time TIMESTAMPZ;
BEGIN   the_sql := ''SELECT ''''January 1 1970''''::timestamp + ''''''            || $1            || ''
seconds''''::intervalAS "foo"'';   RAISE NOTICE ''%'', the_sql;   FOR the_record IN EXECUTE the_sql LOOP       the_time
:=the_record.foo;   END LOOP;   RETURN the_time;
 
END;
' LANGUAGE 'plpgsql';

Cheers,
D
-- 
David Fetter david@fetter.org http://fetter.org/
phone: +1 510 893 6100    cell: +1 415 235 3778


Re: New function: epoch_to_timestamp...

From
Tom Lane
Date:
David Fetter <david@fetter.org> writes:
> [code]

Seems pretty messy.  I believe the standard way of doing this is

regression=# create function epoch_to_timestamp(float8) returns timestamptz as '
regression'# begin
regression'#   return ''epoch''::timestamptz + $1 * ''1 second''::interval;
regression'# end' language plpgsql strict immutable;
CREATE FUNCTION

regression=# select now(), extract(epoch from now());             now              |    date_part
-------------------------------+-----------------2003-08-16 08:43:16.925501-04 | 1061037796.9255
(1 row)

regression=# select epoch_to_timestamp(1061037796.9255);    epoch_to_timestamp
-----------------------------2003-08-16 08:43:16.9255-04
(1 row)

        regards, tom lane