如何使用季度末日期进行数学计算?
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
。
我有以下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
。