Question

I am trying to extract the date from a query in postgres. The timestamp is stored as UTC, so if I have 1/1/2014 02:00:00, I want the date in pacific time, to be 12/31/2013, not 1/1/2014. I am really close, but both query 2 and 3 still return 1/1/2014.

SELECT '1-1-2014 02:00:00'::timestamp at time zone 'America/Los_Angeles';

returns

2014-01-01 02:00:00-08

-

SELECT CAST('1-1-2014 02:00:00'::timestamp at time zone 'America/Los_Angeles' AS Date);

returns

2014-01-01

but I want it to return 2013-12-31.

SELECT CAST('1-1-2014 00:02:00'::timestamp at time zone 'America/Los_Angeles' AS Date) at time zone 'America/Los_Angeles';

returns

2014-01-01 00:00:00

but I want it to return 2013-12-31 00:00:00

I basically want to return the date in the timezone it is in, in this case the pacific timezone.

Was it helpful?

Solution

If it is timestamp without time zone you need first to tell it to use the UTC time zone and then convert to another time zone:

SELECT '1-1-2014 02:00:00'::timestamp at time zone 'UTC' at time zone 'America/Los_Angeles';
      timezone       
---------------------
 2013-12-31 18:00:00

OTHER TIPS

If 'America/Los_Angeles' is your current time zone (timezone setting of the current session) then just tell Postgres the time zone of the timestamp.

SELECT ('2014-01-01 02:00:00'::timestamp AT TIME ZONE 'UTC')::date;

The cast to date is based on the current time zone and works automatically as desired.

If the current time zone can be something else, you need to be explicit like @Clodoaldo demonstrates.

The proper solution would be to store a timestamp with time zone (timestamptz) to begin with, then you can just cast to date:

SELECT '2014-01-01 02:00:00+0'::timestamptz::date;

About timestamps in Postgres:

Recent related answer with more details (also dealing with indexes):

I figured it out, using the interval, I can subtract the offset and then get the date.

SELECT '1-1-2014 02:00:00'::timestamp + INTERVAL '1 hour' * extract(timezone_hour FROM '1-1-2014 00:02:00'::timestamp at time zone 'America/Los_Angeles');

Adding the answer here, since I am sure this question might be something others would want to know.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top