如何使用季度末日期进行数学计算?

How do I do math using quarter-end dates?

我有以下table。 "quarter" 列中的每个值都是日历季度末(例如 3/31、6/30、9/30、12/31),数据可以追溯到 1970 年代:

name   | value | quarter
-------|-------|----------
bob    | 12    | 2014-3-31
jane   | 9     | 2014-6-30
bob    | 12    | 2014-9-30
dave   | 12    | 2014-12-31
bob    | 7     | 2015-3-31
mary   | 17    | 2015-6-30
mary   | 12    | 2015-9-30

我正在 select 根据它们是否早于指定的季度结束日期来收集一些记录:例如"SELECT rows that are >= to 2 quarters ago" 或“>= 15 个季度前”,等等

从最近一个季度查找 1 年前的记录很容易:

SELECT * FROM mytable WHERE quarter >= (SELECT max(quarter) - interval '12 month' FROM mytable)

name   | value | quarter
-------|-------|----------
bob    | 12    | 2014-9-30
dave   | 12    | 2014-12-31
bob    | 7     | 2015-3-31
mary   | 17    | 2015-6-30
mary   | 12    | 2015-9-30

但是,我不知道如何 select 基于季度的记录,比如 2 个季度(请记住,虽然数据可以追溯到 1970 年代,但我没有每个在那里的季度,所以我错过了一些季度,如 1987 年 12 月 31 日、2011 年 9 月 30 日等):

SELECT * FROM mytable WHERE quarter >= (SELECT max(quarter) - interval '2 quarter' FROM mytable)

ERROR:  invalid input syntax for type interval: "2 quarter"

编辑: 结束点将始终相对于 table...

中的最大(四分之一)

您可以定义一个函数将日期转换为 "quarters"(即连续整数),如下所示:

create function quarternum(d date) returns integer as $$
  select extract(year from d)::integer*4 +
         extract(quarter from d)::integer;
$$ language sql;

例如:

postgres=# select quarternum('2014-3-31');
 quarternum 
------------
       8057
(1 row)

postgres=# select quarternum('2014-6-30'); -- next quarter gets +1 to its number
 quarternum 
------------
       8058
(1 row)

有了这样的功能,您可以使用简单的整数数学,例如。 g.

-- 2 quarters away
SELECT * FROM mytable
WHERE quarternum(quarter) >=
      (SELECT quarternum(max(quarter)) - 2 FROM mytable)

此外,您或许可以使用 quarternum(current_date) 而不是在 table 上计算 max