我想采用“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)
我怎样才能将此字符串解析为正确的日期?
使用字符串操作函数 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)
在 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)
| 归档时间: |
|
| 查看次数: |
1782 次 |
| 最近记录: |