簡體   English   中英

使用帶有時區的 generate_series

[英]Using generate_series with timezone

我正在嘗試生成一個系列,在 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

generate_series迭代工作,因此它通過將步驟添加到珍貴元素來計算下一個元素。

問題是計算是在您當前的時區完成的。 不幸的是,“一個月后”的確切含義取決於時區......

要使這項工作按預期進行,請更改您的時間音以匹配語句中的時區:

SET timezone='+03';

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM