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

dan*_*ler 3 postgresql

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

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

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

**result**
2014-01-01

**desired result**
2014-07-01
Run Code Online (Sandbox Code Playgroud)

我怎样才能将此字符串解析为正确的日期?

kli*_*lin 5

使用字符串操作函数 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)
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)


Mah*_*oud 2

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

make_date(year, month, day)
Run Code Online (Sandbox Code Playgroud)

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

make_date(year, quarter * 3 -2 , 1)::date
Run Code Online (Sandbox Code Playgroud)