【问题标题】:How to have date on YYYY-MM with function extract()如何使用函数 extract() 在 YYYY-MM 上获取日期
【发布时间】:2026-02-18 02:25:01
【问题描述】:

只有当月结束时,我才会尝试拥有所有价值。我暂时做到了:

select
extract(month from mois_entre ) as mois_finis 
 from   table1
where  extract(year from mois_entre ) = extract(year from CURRENT_DATE()) and
extract(month from mois_entre ) < extract(month from CURRENT_DATE()) or extract(year from mois_entre ) < extract(year from CURRENT_DATE()) 
and to_char(mois_entre , 'yyyy/mm/dd') between  '2021/01/01'  and '2021/07/16' 

效果很好,但我的问题是我的结果是这样的:

mois_finis
1
2
3
4
5
6

所以“1”表示一月,2 表示“二月”等。我没有 7,因为 7 月还没有结束。

但现在我的目标是:

mois_finis

january-2021
February-2021
...
...
June-2021

或者拥有

01-2021  or 2021-01
..
...
..
06-2021  or 2021-06

提前致谢!

【问题讨论】:

  • 请用您正在使用的 DBMS(Oracle、SQL Server、MySQL、Postgres 等之一)标记您的问题

标签: sql date format snowflake-cloud-data-platform


【解决方案1】:

您可以使用 TO_VARCHAR 来提取日期的某些部分,而不是使用 EXTRACT:

with table1 as (
select '2021-01-01'::date mois_entre )
select
TO_VARCHAR(mois_entre,'MM-YYYY' ) as mois_finis,
TO_VARCHAR(mois_entre,'MMMM-YYYY' ) as mois_finis_alternative
from   table1
where  extract(year from mois_entre ) = extract(year from CURRENT_DATE()) and
extract(month from mois_entre ) < extract(month from CURRENT_DATE()) or extract(year from mois_entre ) < extract(year from CURRENT_DATE()) 
and to_char(mois_entre , 'yyyy/mm/dd') between  '2021/01/01'  and '2021/07/16' ;


+------------+------------------------+
| MOIS_FINIS | MOIS_FINIS_ALTERNATIVE |
+------------+------------------------+
| 01-2021    | January-2021           |
+------------+------------------------+

也可以提取年份和月份并将它们组合起来,但这需要额外的努力:

with table1 as (
select '2021-01-01'::date mois_entre )
select
extract(year from mois_entre ) || '-' || ltrim(to_varchar(extract(month from mois_entre ), '00' )) as mois_finis
from   table1
where  extract(year from mois_entre ) = extract(year from CURRENT_DATE()) and
extract(month from mois_entre ) < extract(month from CURRENT_DATE()) or extract(year from mois_entre ) < extract(year from CURRENT_DATE()) 
and to_char(mois_entre , 'yyyy/mm/dd') between  '2021/01/01'  and '2021/07/16' ;

【讨论】: