我如何获得 PostgreSQL 中两个日期之间的季度数?
How can i get number of quarters between two dates in PostgreSQL?
我有 MS SQL 功能 DATEDIFF
SELECT DATEDIFF(QQ, 0, '2018-09-05')
那 returns 474(整数)。
什么是 PostgreSQL 这个函数的等价物?
在 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
MSSQL 0
是DATEDIFF(QQ, 0, '2018-09-05')
中的日期'1900-01-01'
,那个函数会得到1900-01-01
到2018-09-05
的QUARTER
的个数
但是 PostgreSQL 没有 QUARTER
数字函数。
你可以尝试使用
EXTRACT(QUARTER FROM TIMESTAMP '2018-09-05')
得到这个月 QUARTER
的数字。
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
| quarter |
|---------|
| 474 |
我认为目前接受的是不正确的。
例如如果您将日期“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')
return1 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|
假设您在示例 table 中有两个日期:start_date 和 end_date
以下是获取这些日期之间的季度数差异的方法:
select * (year(end_date)*4 + quarter(end_date)) - (year(start_date)*4 + quarter(start_date)) as quarter_diff
from example
我有 MS SQL 功能 DATEDIFF
SELECT DATEDIFF(QQ, 0, '2018-09-05')
那 returns 474(整数)。
什么是 PostgreSQL 这个函数的等价物?
在 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
MSSQL 0
是DATEDIFF(QQ, 0, '2018-09-05')
中的日期'1900-01-01'
,那个函数会得到1900-01-01
到2018-09-05
的QUARTER
的个数
但是 PostgreSQL 没有 QUARTER
数字函数。
你可以尝试使用
EXTRACT(QUARTER FROM TIMESTAMP '2018-09-05')
得到这个月QUARTER
的数字。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
| quarter |
|---------|
| 474 |
我认为目前接受的是不正确的。
例如如果您将日期“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')
return1 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|
假设您在示例 table 中有两个日期:start_date 和 end_date
以下是获取这些日期之间的季度数差异的方法:
select * (year(end_date)*4 + quarter(end_date)) - (year(start_date)*4 + quarter(start_date)) as quarter_diff
from example