Vous n'êtes pas identifié(e).

#1 29/08/2019 10:50:28

zetar
Membre

Pb Fonction avec dates

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

#2 29/08/2019 14:35:43

dverite
Membre

Re : Pb Fonction avec dates

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)

Hors ligne

#3 29/08/2019 15:31:02

zetar
Membre

Re : Pb Fonction avec dates

Re,


Merci !

Testé et approuvé... smile


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

Pied de page des forums