如何在postgres中获取前几个月的范围

How to get previous months ranges in postgres

我正在尝试获取从现在开始的过去 12 个月的日期范围。

然而,由于月份的天数不同,我想知道是否可以在数据库级别计算这些日期,或者我是否必须在外部计算值并将它们作为变量传递。

例如我们在九月我需要

'september', ["2020-09-01 00:00:00+00","2020-10-01 00:00:00+00"]
'august', ["2020-08-01 00:00:00+00","2020-09-01 00:00:00+00"]
'july', ["2020-07-01 00:00:00+00","2020-08-01 00:00:00+00"]
'june', ["2020-06-01 00:00:00+00","2020-07-01 00:00:00+00"]
...

您可以使用 date_trunc()month 参数来调整月份中周数的变化。

SELECT
  to_char(now() - series.n * '1 month'::interval, 'month') AS "month",
  tstzrange(
    date_trunc('month', now()) - series.n * '1 month'::interval,
    date_trunc('month', now()) - (series.n - 1) * '1 month'::interval,
    '[]'
  ) AS range_dates
FROM (
  SELECT generate_series(0, 11) AS n
) AS series

生产:

'september',["2020-09-01 00:00:00+00","2020-10-01 00:00:00+00"]
'august', ["2020-08-01 00:00:00+00","2020-09-01 00:00:00+00"]
'july', ["2020-07-01 00:00:00+00","2020-08-01 00:00:00+00"]
'june', ["2020-06-01 00:00:00+00","2020-07-01 00:00:00+00"]
'may', ["2020-05-01 00:00:00+00","2020-06-01 00:00:00+00"]
'april', ["2020-04-01 00:00:00+00","2020-05-01 00:00:00+00"]
'march', ["2020-03-01 00:00:00+00","2020-04-01 00:00:00+00"]
'february', ["2020-02-01 00:00:00+00","2020-03-01 00:00:00+00"]
'january', ["2020-01-01 00:00:00+00","2020-02-01 00:00:00+00"]
'december', ["2019-12-01 00:00:00+00","2020-01-01 00:00:00+00"]
'november', ["2019-11-01 00:00:00+00","2019-12-01 00:00:00+00"]
'october', ["2019-10-01 00:00:00+00","2019-11-01 00:00:00+00"]