Re: Returning timestamp with timezone at specified timezone irrespective of client timezone

Поиск
Список
Период
Сортировка
От Adrian Klaver
Тема Re: Returning timestamp with timezone at specified timezone irrespective of client timezone
Дата
Msg-id 0c452adb-9047-09ec-7086-e804bf381c69@aklaver.com
обсуждение исходный текст
Ответ на Returning timestamp with timezone at specified timezone irrespective of client timezone  ("aNullValue (Drew Stemen)" <drew@anullvalue.net>)
Ответы Re: Returning timestamp with timezone at specified timezone irrespective of client timezone  ("aNullValue (Drew Stemen)" <drew@anullvalue.net>)
Список pgsql-general
On 9/27/20 2:16 PM, aNullValue (Drew Stemen) wrote:
> Hello,
> 
> I've attempted to obtain help with this problem from several other 
> places, but numerous individuals recommended I ask this mailing list.
> 
> What I need is for the ability to return a timestamp with timezone, 
> using the UTC offset that corresponds to a column-defined timezone, 
> irrespective of the client/session configured timezone.
> 
> I have three columns in a table:
> Timezone: 'US/Eastern'
> Date: 2020-10-31
> Time: 08:00
> 
> The output I'm able to find includes these possibilities:
> '2020-10-31 08:00:00'
> '2020-10-31 12:00:00+00'
> 
> Whereas what I actually need is:
> '2020-10-31 08:00:00-05'
> 
> Using the postgresql session-level timezone configuration won't work 
> because I need multiple timezones to be handled in a single set.
> 
> Example code follows. I'm not using to_char in the examples as I likely 
> would in the production code, but I haven't found any way that it could 
> be helpful here regardless.
> 
> ---------------------------------------------------
> 
> SET TIME ZONE 'UTC';
> 
> CREATE TABLE loc
> (
>      id serial not null,
> timezone text not null,
>      loc_date date NOT NULL,
>      loc_time text NOT NULL,
>      CONSTRAINT loc_pkey PRIMARY KEY (id),
>      CONSTRAINT loc_loc_time_check CHECK (loc_time ~ 
> '(^(2[0-3]|[01][0-9]|[0-9]):?([0-5][0-9]):?([0-5][0-9])?$)|(^(1[012]|0[1-9]|[1-9]):[0-5][0-9] 
> [AaPp][Mm]$)'::text)
> )
> ;
> 
> INSERT INTO loc (timezone, loc_date, loc_time) VALUES
> ('US/Eastern', '2020-10-31', '08:00'),
> ('US/Eastern', '2020-11-03', '08:00'),
> ('US/Central', '2020-10-31', '08:00'),
> ('US/Central', '2020-11-03', '08:00');
> 
> SELECT *
> , timezone(l.timezone, l.loc_date + l.loc_time::time without time zone) 
> tswtz
> , (l.loc_date + l.loc_time::time without time zone) tswotz
> FROM loc l
> ORDER BY timezone, loc_date, loc_time
> ;
> 
> ---------------------------------------------------
> 
> id |  timezone  |  loc_date  | loc_time |         tswtz          |       
> tswotz
> ----+------------+------------+----------+------------------------+---------------------
>    7 | US/Central | 2020-10-31 | 08:00    | 2020-10-31 13:00:00+00 | 
> 2020-10-31 08:00:00
>    8 | US/Central | 2020-11-03 | 08:00    | 2020-11-03 14:00:00+00 | 
> 2020-11-03 08:00:00
>    5 | US/Eastern | 2020-10-31 | 08:00    | 2020-10-31 12:00:00+00 | 
> 2020-10-31 08:00:00
>    6 | US/Eastern | 2020-11-03 | 08:00    | 2020-11-03 13:00:00+00 | 
> 2020-11-03 08:00:00
> (4 rows)
> 
> What I actually need is, in example id=7, '2020-10-31 08:00:00-05'.
> 
> Is this even possible? Several people have proposed that I write a 
> custom function to do this on a per-row basis, which... I suppose I can 
> do... I'm just blown away that this isn't something that just works "out 
> of the box".
> 

Something like?:

select '2020-10-31' || ' 08:00 ' || utc_offset from pg_timezone_names 
where name = 'US/Eastern';
           ?column?
----------------------------
  2020-10-31 08:00 -04:00:00


-- 
Adrian Klaver
adrian.klaver@aklaver.com



В списке pgsql-general по дате отправления:

Предыдущее
От: "aNullValue (Drew Stemen)"
Дата:
Сообщение: Returning timestamp with timezone at specified timezone irrespective of client timezone
Следующее
От: "aNullValue (Drew Stemen)"
Дата:
Сообщение: Re: Returning timestamp with timezone at specified timezone irrespective of client timezone