【问题标题】:How can i get number of quarters between two dates in PostgreSQL?如何在 PostgreSQL 中获取两个日期之间的季度数?
【发布时间】:2019-02-11 08:57:37
【问题描述】:

我有 MS SQL 函数DATEDIFF

SELECT DATEDIFF(QQ, 0, '2018-09-05')

返回 474(整数)。

这个函数的 PostgreSQL 等价物是什么?

【问题讨论】:

  • @Larnu,他问参考文献中没有 datediff 季度是对的

标签: sql postgresql date-arithmetic


【解决方案1】:

MSSQL 0 是DATEDIFF(QQ, 0, '2018-09-05') 中的日期'1900-01-01',该函数将获取从1900-01-01 到2018-09-05 的QUARTER 的数量

但是PostgreSQL没有QUARTER数字函数。

你可以尝试使用

  1. EXTRACT(QUARTER FROM TIMESTAMP '2018-09-05') 获取本月QUARTER 号码。

  2. date_part('year',age('2018-09-05','1900-01-01')) 获取年数 '2018-09-05' 和 '1900-01-01'。

然后做一些计算。

select (EXTRACT(QUARTER FROM TIMESTAMP '2018-09-05') + 
      date_part('year',age('2018-09-05','1900-01-01')) * 4) -1 QUARTER

Results:

| quarter |
|---------|
|     474 |

【讨论】:

  • 此解决方案假定第二个日期始终停留在第一季度,并且两个日期之间的差距超过一年,而问题未指定这些要求。考虑 2018 年 7 月 1 日和 2018 年 9 月 5 日,使用该解决方案得出的答案为 2,这是不正确的。
  • 请参考Tim Yeung回答
【解决方案2】:

我认为当前接受的不正确。

例如如果您将日期“1900-01-01”更改为“2017-07-01”,您实际上会得到 6 季度差异。

  • 但预期的结果应该是:
    • 包括第一季度和最后一季度:5
    • 排除第一季度和最后一个季度:3
    • 不包括上一季度:4
    select 
        age('2018-09-05','2017-07-01') age,
        (EXTRACT(QUARTER FROM TIMESTAMP '2018-09-05') + 
      date_part('year',age('2018-09-05','2017-07-01')) * 4) -1 QUARTER

结果:

age                 |quarter|
--------------------|-------|
1 year 2 mons 4 days|      6|

原因是age('2018-09-05','2017-07-01')返回1 year 2 mons 4 days(可能超过12个月)。


我用来计算季度数的答案:

with params as (
    select 
        '2017-07-01 00:00:00'::timestamp date_from,
        '2018-09-05 00:00:00'::timestamp date_to
)
select      
    extract( quarter from date_from)::int date_from_quarter,
    (extract( quarter from date_to))::int date_to_quarter,
    age(date_to, date_from) date_diff,
    (extract(year from date_to) - extract(year from date_from))::int how_many_yr,
    -- exclude begin and end
    (extract(year from date_to) - extract(year from date_from))::int* 4 - extract( quarter from date_from)::int + (extract( quarter from date_to))::int - 1 quarter_diff,
    -- exclude begin quarter 
    (extract(year from date_to) - extract(year from date_from))::int* 4 - extract( quarter from date_from)::int + (extract( quarter from date_to))::int quarter_diff_include_current_quarter
    from params
;

结果:

date_from_quarter|date_to_quarter|date_diff           |how_many_yr|quarter_diff|quarter_diff_include_current_quarter|
-----------------|---------------|--------------------|-----------|------------|------------------------------------|
                3|              3|1 year 2 mons 4 days|          1|           3|                                   4|

【讨论】:

    【解决方案3】:

    在 Postgres 上很复杂:

    ( (DATE_PART('year',  '2018-09-05') - DATE_PART('year', '1900-01-01')) * 12 
       + (DATE_PART('month',  '2018-09-05') - DATE_PART('month', '1900-01-01'))
    ) / 4
    

    其他资源:topic

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-20
      • 2017-08-19
      • 2021-03-12
      • 1970-01-01
      • 2012-04-27
      • 1970-01-01
      • 2017-11-28
      • 1970-01-01
      相关资源
      最近更新 更多