我想采用格式' 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
如何将此字符串解析为正确的日期?
答案 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