在PostgreSQL中如何获取两个日期之间的季度数?

5

我有一个 MS SQL 函数 DATEDIFF

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

返回整数474的函数是什么?

这个函数在PostgreSQL中有什么等效的呢?


@Larnu,他问得对,参考资料中没有datediff quarter。 - Fourat
4个回答

2

MSSQL中的函数DATEDIFF(QQ, 0, '2018-09-05')返回从1900-01-012018-09-05之间的QUARTER数。其中,0代表'1900-01-01'

但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年07月01日和2018年09月05日,使用该解决方案得到的答案为2,这是不正确的。 - Mr. Brickowski
请参考Tim Yeung的答案。 - Mr. Brickowski

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年2个月4天(可能超过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|

0

在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

其他资源:主题


0

假设你有一个示例表中的两个日期:start_date和end_date

以下是如何获取这些日期之间季度数差异的方法:

select * (year(end_date)*4 + quarter(end_date)) - (year(start_date)*4 + quarter(start_date)) as quarter_diff 
from example

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接