将年/季度格式的期间转换为日期(季度的第一天)

时间:2016-08-10 19:06:21

标签: postgresql

我想采用格式' YYYYQQ'并将其解析为日期。具体来说,我想将其解析为本季度的第一个日期。例如,我想解析2016Q2'进入' 2016-04-01'。

根据Postgres文档," to_date和to_timestamp"忽略Q(季度)。坦率地说,我希望它不被忽略:)这意味着这段代码将返回一个我不想要的结果:

select to_date('2014q3', 'YYYY\qQ');

**result**
2014-01-01

**desired result**
2014-07-01

如何将此字符串解析为正确的日期?

2 个答案:

答案 0 :(得分:4)

使用string manipulation functions format()left()right()

with quarters(q) as (
    values ('2014q1'), ('2015q2'), ('2016q3'), ('2017q4')
)
select format('%s-%s-1', left(q, 4), right(q, 1)::int* 3- 2)::date
from quarters;

   format   
------------
 2014-01-01
 2015-04-01
 2016-07-01
 2017-10-01
(4 rows)

为方便起见创建一个函数:

create or replace function quarter_to_date(text)
returns date language sql as $$
    select format('%s-%s-1', left($1, 4), right($1, 1)::int* 3- 2)::date
$$;

with quarters(q) as (
    values ('2014q1'), ('2015q2'), ('2016q3'), ('2017q4')
)
select quarter_to_date(q)
from quarters;

 quarter_to_date 
-----------------
 2014-01-01
 2015-04-01
 2016-07-01
 2017-10-01
(4 rows)

答案 1 :(得分:0)

在 PostgreSQL 9.4 及更高版本中,有一个函数可以创建日期。

make_date(year, month, day)

您可以按如下方式使用它:

make_date(year, quarter * 3 -2 , 1)::date