如何使用季末结算日期进行数学运算?

时间:2015-10-28 04:03:10

标签: sql postgresql postgresql-9.4

我有下表。 " quarter"中的每个值列是一个日历四分之一结束(例如3 / 31,6 / 30,9 / 30,12 / 31),数据可以追溯到20世纪70年代:

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

我根据是否超过指定的季度结束日期选择了一些记录:例如"选择> =到2个季度之前的行"或"> = 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

但是,我无法弄清楚如何选择基于季度的记录,比如2个季度之后(请记住,虽然数据可以追溯到20世纪70年代,但我并不是每个季度都有所以我错过了一些季度,如12/31/1987,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"

编辑: 结束点始终相对于表格中的最大值(季度)...

1 个答案:

答案 0 :(得分:0)

您可以定义一个功能,将日期转换为"季度" (即顺序整数),如下所示:

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)

使用此功能,您可以使用简单的整数数学,例如:克。

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

此外,你可以使用quarternum(current_date)而不是在桌子上计算max