Функция date_trunc с учетом часового пояса

Следующий запрос

SELECT the_date FROM date_trunc('day', timestamp with time zone 
       '2001-01-1 00:00:00+0100') as the_date

результаты к

the_date
2000-12-31 00:00

Есть ли способ указать date_trunc делать преобразования день / месяц / год в зависимости от часового пояса, с которым он подается?

Ожидаемый результат будет: 2001-01-1 00:00+0100

2 ответа

Решение

Вам нужно указать, в каком часовом поясе вы хотите его показывать

select
    date_trunc(
        'day',
        timestamp with time zone '2001-01-1 00:00:00+0100' at time zone '-02'
    ) as the_date;
      the_date       
---------------------
 2001-01-01 00:00:00

AT TIME ZONE

Хотя помеченный ответ может быть правильным для странных обстоятельств ОП, для других он более вероятен. Вам необходимо преобразовать метку времени, возвращенную date_trunc, в соответствующий часовой пояс.

select
    date_trunc(
        'day',
        some_timestamp at time zone users_timezone
    ) at time zone users_timezone as the_date;

Важно понимать, что date_trunc возвращает timestamp без привязки часового пояса к нему. Вам необходимо преобразовать временную метку в правильный часовой пояс, потому что клиент базы данных или любой другой нисходящий поток может иметь другой часовой пояс.

@ Ответ Адама определенно более полезен. Хотя я думаю, что мы можем улучшить его снова, потому что, если мы усекаем метку времени до одного дня (или недели / месяца и т. Д.), Мы хотим убедиться, что имеем дело с объектом Date, а не с меткой времени. В противном случае мы можем создать у других фрагментов кода впечатление, что что-то на самом деле произошло в полночь (или, возможно, в другое время суток, вводящее в заблуждение).

Поэтому я бы использовал:

SELECT date_trunc('day', some_timestamp AT TIME ZONE users_timezone)::date AS the_date;

который преобразует результат в дату, а не в метку времени.

Результат будет примерно таким:

  the_date
------------
 2019-09-14

вместо более вводящего в заблуждение результата:

      the_date
---------------------
 2019-09-14 00:00:00
Другие вопросы по тегам