Функция 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