Использование generate_series с часовым поясом - PullRequest
2 голосов
/ 06 мая 2020

Я пытаюсь создать серию, которая показывает первый день каждого месяца в PostgreSQL

select generate_series('2020-01-01T00:00:00+03:00'::timestamptz, '2020-12-31T23:59:59+03:00'::timestamptz, '1 month');

, этот запрос возвращает этот результат

    generate_series     
------------------------
 2019-12-31 21:00:00+00
 2020-01-31 21:00:00+00
 2020-02-29 21:00:00+00
 2020-03-29 21:00:00+00
 2020-04-29 21:00:00+00
 2020-05-29 21:00:00+00
 2020-06-29 21:00:00+00
 2020-07-29 21:00:00+00
 2020-08-29 21:00:00+00
 2020-09-29 21:00:00+00
 2020-10-29 21:00:00+00
 2020-11-29 21:00:00+00
 2020-12-29 21:00:00+00
(13 rows)

, но я ожидаю, что

    generate_series     
------------------------
 2019-12-31 21:00:00+00
 2020-01-31 21:00:00+00
 2020-02-29 21:00:00+00
 2020-03-31 21:00:00+00
 2020-04-30 21:00:00+00
 2020-05-31 21:00:00+00
 2020-06-30 21:00:00+00
 2020-07-31 21:00:00+00
 2020-08-31 21:00:00+00
 2020-09-30 21:00:00+00
 2020-10-31 21:00:00+00
 2020-11-30 21:00:00+00
(12 rows)

Где я go ошибся?

также нет проблем с использованием этого способа

select generate_series('2020-01-01T00:00:00'::timestamptz, '2020-12-31T23:59:59'::timestamptz, '1 month');
    generate_series     
------------------------
 2020-01-01 00:00:00+00
 2020-02-01 00:00:00+00
 2020-03-01 00:00:00+00
 2020-04-01 00:00:00+00
 2020-05-01 00:00:00+00
 2020-06-01 00:00:00+00
 2020-07-01 00:00:00+00
 2020-08-01 00:00:00+00
 2020-09-01 00:00:00+00
 2020-10-01 00:00:00+00
 2020-11-01 00:00:00+00
 2020-12-01 00:00:00+00

1 Ответ

1 голос
/ 06 мая 2020

generate_series работает итеративно, поэтому он вычисляет следующий элемент, добавляя шаг к драгоценному элементу.

Проблема в том, что расчет выполняется в вашем текущем часовом поясе. К сожалению, точное значение слова «месяц спустя» зависит от часового пояса ...

Чтобы все работало должным образом, измените тон времени, чтобы он соответствовал часовому поясу в заявлении:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...