| From: | Adrian Klaver <adrian(dot)klaver(at)aklaver(dot)com> |
|---|---|
| To: | Steve Crawford <scrawford(at)pinpointresearch(dot)com>, PG-General Mailing List <pgsql-general(at)postgresql(dot)org> |
| Subject: | Re: Unexpected date conversion results |
| Date: | 2025-11-22 00:52:40 |
| Message-ID: | 438f84e1-52ff-410e-8e33-03029f04927a@aklaver.com |
| Views: | Whole Thread | Raw Message | Download mbox | Resend email |
| Thread: | |
| Lists: | pgsql-general |
On 11/21/25 16:38, Adrian Klaver wrote:
> On 11/21/25 16:09, Steve Crawford wrote:
>> Either there is a bug in my understanding or one in PostgreSQL. I
>> expect a date value to follow the current time zone setting and be
>> interpreted as midnight at the start of the given date. In many cases
>> it does. Shown below are the postgresql.conf settings and the psql
>> client settings showing the time zone to be America/Los_Angeles:
>>
>> postgresql.conf:
>> log_timezone = 'America/Los_Angeles'
>> timezone = 'America/Los_Angeles'
>>
>> Client time zone setting:
>>
>> steve=> show timezone;
>> TimeZone
>> ---------------------
>> America/Los_Angeles
>>
>>
>
>> However, extracting the epoch from current_date returns 4pm the prior
>> day (i.e. 2025-11-21 00:00:00-00), in other words midnight 2025-11-21
>> UTC which seems to be inconsistent behavior:
>
>
> https://www.postgresql.org/docs/current/functions-
> datetime.html#FUNCTIONS-DATETIME-EXTRACT
>
> "epoch
>
> For timestamp with time zone values, the number of seconds since
> 1970-01-01 00:00:00 UTC (negative for timestamps before that); for date
> and timestamp values, the nominal number of seconds since 1970-01-01
> 00:00:00, without regard to timezone or daylight-savings rules; for
> interval values, the total number of seconds in the interval
> "
>
> So epoch is in UTC which is confirmed by below.
>>
>> steve=> select to_timestamp(extract(epoch from current_date));
>> to_timestamp
>> ------------------------
>> 2025-11-20 16:00:00-08
>
> If you want it to work(I am in 'America/Los_Angeles' also):
>
> select to_timestamp(extract(epoch from current_date)) at time zone 'UTC';
>
> timezone
> ---------------------
> 2025-11-21 00:00:00
Or something like:
select extract(epoch from current_date);
extract
------------
1763683200
select to_timestamp(extract(epoch from current_date));
to_timestamp
------------------------
2025-11-20 16:00:00-08
select extract(epoch from current_date::timestamptz);
extract
-------------------
1763712000.000000
select to_timestamp(extract(epoch from current_date::timestamptz));
to_timestamp
------------------------
2025-11-21 00:00:00-08
Where the latter does the rotation to the TimeZone setting via
::timestamptz and you get 28,800 second(8 hr) difference and a returned
timestamptz that is correct for the TimeZone.
>
>
>> There was a time, like version 9-dot-something, when the above queries
>> performed as expected returning midnight in the current time zone but
>> I haven't been able to find a change document indicating this as an
>> expected change.
>
> I don't remember that, but as the gray content of the hair increases the
> memory is less solid:)
>
>>
>> -Steve
>
>
--
Adrian Klaver
adrian(dot)klaver(at)aklaver(dot)com
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Tom Lane | 2025-11-22 00:55:08 | Re: Unexpected date conversion results |
| Previous Message | Tom Lane | 2025-11-22 00:51:24 | Re: Unexpected date conversion results |