postgresql: чувствительный к часовому поясу запрос на временной отметке без часового пояса - PullRequest
3 голосов
/ 15 марта 2011

У меня есть таблица со столбцом timestamp without time zone (вводимые данные предполагаются в Australia/Sydney часовом поясе).

Запрос данных для временного диапазона (т.е. с 8:00 до 16:00) в America/New_York часовой пояс.

Есть ли простой способ добиться этого?

спасибо, стр.

Ответы [ 2 ]

3 голосов
/ 15 марта 2011

Понял.

Вам нужно сначала преобразовать время в его with time zone версию, то есть my_ts at time zone 'Australia/Sydney', а затем преобразовать его в своего нью-йоркского коллегу через at time zone 'America/New_York'

select
    my_ts as "Default(syd)",
    my_ts at time zone 'Australia/Sydney' as "SYD",
    my_ts at time zone 'Australia/Sydney' at time zone 'America/New_York' as "NY",
    date_part('hour', my_ts at time zone 'Australia/Sydney' at time zone 'America/New_York') as "NY-hr"
from my_table
where date_part('hour', my_ts at time zone 'Australia/Sydney' at time zone 'America/New_York')>=8
    and date_part('hour', my_ts at time zone 'Australia/Sydney' at time zone 'America/New_York')<16
0 голосов
/ 15 марта 2011

Вы можете преобразовать все в один и тот же часовой пояс, чтобы вы могли сравнить их с (если часовой пояс был установлен):

select current_time, current_time at time zone 'gmt';
      timetz       |     timezone      
-------------------+-------------------
 20:50:51.07742-07 | 03:50:51.07742+00

Если часовой пояс не установлен, и вам нужно исправить его в некотором локальномвремя:

select now()::time, now()::time + '+8:00'::interval;
       now       |    ?column?     
-----------------+-----------------
 20:57:49.420742 | 04:57:49.420742

Как только вы получите желаемое время, просто извлеките час, и вы можете использовать простое условие, чтобы выбрать правильное время.

select * 
  from 
  (select extract(hour from now()::time + '+8:00'::interval) as hour) as t 
  where hour between 8 and 16;
...