Tentative de construction d'une instruction select dans psql avec une liste d'années correspondant à (x) nombre d'années avant "cette année".
Modifications de la réponse fournie dans SQL pour retourner liste des années depuis une année spécifique de travail pour sql, mais pas pour postgres.
J'ai essayé de bricoler avec generate_series, mais sans succès.
3 Réponses :
Utilisez -1 pas. Exemple x = 15
select
extract(year from x.y)
from
generate_series(
current_timestamp,
current_timestamp - interval '1 year' * 15,
interval '-1 year'
) as x(y)
Une autre approche:
select *
from
generate_series(
extract(year from current_date)::int,
extract(year from current_date)::int - 15,
-1
)
Test en direct: https://www.db-fiddle.com/f/shVQnibndNh45uCZxt4jgs/3
Merci! Travaillé. A pris la première option et l'a enveloppée dans une clause «With» afin d'obtenir le résultat final sous forme de caractère, ce qui semble fonctionner. avec yearlist as (select * from generate_series (extract (year from current_date) :: int, extract (year from current_date) :: int - 70, -1) as Years) select cast (Years as CHAR (4)) from yearlist
Un peu plus court: vous pouvez également utiliser la variante numérique du generate_series et transtypez la valeur de retour de la EXTRACT fonctionne directement, par exemple:
SELECT
EXTRACT(YEAR FROM CURRENT_DATE + ('1y'::interval * x))::text AS year
FROM
generate_series(-7, -1) AS x
;
Si vous arrivez à ce que les «années» sont des dates, vous pouvez faire:
with recursive yearlist as (
select extract(year from now()) as year, 1 as lev
union all
select yl.year - 1 as year, lev + 1
from yearlist yl
where lev < 15
)
select year
from yearlist
order by year desc;
(C'est ainsi que je voudrais normalement une liste d'années.)
Plus important encore, vous pouvez facilement adapter le code SQL Server à Postgres:
select *
from generate_series(date_trunc('year', now()) - interval '15 year',
date_trunc('year', now()),
interval '1 year'
)
Je recommande plutôt generate_series () , mais je veux démontrer que Postgres prend également en charge les CTE récursifs.