【问题标题】:How do I do math using quarter-end dates?如何使用季度结束日期进行数学运算?
【发布时间】:2015-10-28 04:03:09
【问题描述】:

我有下表。 “季度”列中的每个值都是日历季度末(例如 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

我根据是否早于指定的季度结束日期来选择一些记录:例如“选择 >= 到 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 个季度(请记住,虽然数据可以追溯到 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"

编辑: 结束点将始终相对于表中的最大值(四分之一)...

【问题讨论】:

    标签: sql postgresql postgresql-9.4


    【解决方案1】:

    您可以定义一个函数来将日期转换为“季度”(即连续整数),如下所示:

    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) 而不是在表格上计算max

    【讨论】:

    • 太好了!为什么要将年份乘以 4?
    • 为了获得唯一且连续的季度数字。每年四个季度,因此乘以 4。
    猜你喜欢
    • 1970-01-01
    • 2018-06-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-11
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多