Vous n'êtes pas identifié(e).
Pages : 1
Bonjour,
J'ai développé une requête sous Squirrel qui répond à mes besoins.
Cependant la transposition de celle-ci dans une fonction ne marche pas (avec ou sans cote) !
Quel doit être le type de conversions faut-il appliquer ?
create or replace function FP_DYN_DATE(varchar)
returns date as $$
select case
when $1 = 'HIER' then current_date - 1
when $1 = 'AUJOU' then current_date
when $1 = 'AVTHIER' then current_date - 2
when $1 = 'DERM0' then (case to_char(extract(month from current_date - 1),'09')
when extract(month from current_date - 1) in (01,03,05,07,08,10,12) then to_date(to_char(extract(year from current_date - 1),'9999') || to_char(extract(month from current_date - 1),'09') || 31, 'YYYYMMDD')
when to_char(extract(month from current_date - 1),'09') = '02' then to_date(to_char(extract(year from current_date - 1),'9999') || to_char(extract(month from current_date - 1),'09') || 28, 'YYYYMMDD')
when to_char(extract(month from current_date - 1),'09') in ('04','06','09','11') then to_date(to_char(extract(year from current_date - 1),'9999') || to_char(extract(month from current_date - 1),'09') || 30, 'YYYYMMDD')
else '99' end )
end;
$$ LANGUAGE sql IMMUTABLE;
Voici le message après exécution sous pgadmin 4
ERROR: ERREUR: l'opérateur n'existe pas : text = boolean
LINE 15: when extract(month from current_date - 1) in (01,03,05,07,...
^
HINT: Aucun opérateur ne correspond au nom donné et aux types d'arguments.
Vous devez ajouter des conversions explicites de type.
État SQL :42883
Caractère :859
Merci pour vos retours.
Hors ligne
Le "CASE" interne semble faux parce que c'est un mélange des 2 formes
CASE expression
WHEN valeur1...THEN
WHEN valeur2... THEN
...
et
CASE
WHEN condition1... THEN valeur1
WHEN condition2... THEN valeur1
...
Ces deux formes sont valides mais pas un mix des deux.
Indépendamment de ça vous pouvez certainement simplifier toute cette expression qui fait de multiples conversions date/chaîne de caractères pour calculer quelque chose qui sûrement pourrait s'obtenir de manière plus directe. Il faut voir aussi que coder en dur que le dernier jour de février est le 28 est faux à chaque année bissextile. Si le but est de trouver le dernier jour du mois en cours, il faudrait plutôt ajouter un mois et retrancher un jour avec interval '1 month' et interval '1 day'.
Dernière modification par dverite (29/08/2019 14:38:24)
@DanielVerite
http://blog-postgresql.verite.pro/
Hors ligne
Re,
Merci !
Testé et approuvé...
create or replace function FP_DYN_DATE(varchar)
returns date as $$
select case
when $1 = 'YESDAT' then current_date - 1
when $1 = 'AUJDAT' then current_date
when $1 = 'J-2DAT' then current_date - 2
when $1 = 'DERM0' then to_date(to_char(date_trunc('MONTH', CURRENT_DATE) + INTERVAL '1MONTH - 1DAY', 'YYYYMMDD'), 'YYYYMMDD')
end;
$$ LANGUAGE sql IMMUTABLE;
Hors ligne
Pages : 1