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

#1 15/11/2017 15:15:54

Mlan2
Membre

Fonction de controle de date valide

Bonjour,

Je pensais avoir géré un problème de contrôle de validité d'une date sous forme de chaine de caractères, je constate que cela n'est pas le cas.

J'avais écrit pour cela une fonction pour le réaliser. Force est de constater que le résultat attendu ne répond pas au besoin.

Ci-dessous, la fonction utilisée :


/*
   ____________________________________________________________________
  |Controle d'une valeur de date.                                      |
  |                                                                    |
  |Parametres      : P_Var     -> Parametre de chaine de caracteres    |
  |                                                                    |
  |retour          : retourne True si la valeur est numerique.         |
  |____________________________________________________________________|

*/

CREATE OR REPLACE  FUNCTION IS_DATE (P_VAR  VARCHAR)
RETURNS BOOLEAN
AS $$ 
DECLARE
  V_Dat DATE;

BEGIN
  V_Dat := TO_DATE (P_VAR, 'YYYYMMDD');

  RETURN TRUE;

  EXCEPTION
    WHEN OTHERS THEN
    RETURN FALSE;
END;
$$ LANGUAGE plpgsql;

J'ai détecté le problème en passant à la fonction une date : '30092017', qui pour moi est erronée, selon le format de contrôle utilisé : 'YYYYMMDD'.
Le mois notamment est incorrect : 20.

select is_date ('30092017');
is_date
---------
t

Je suis surpris du résultat, lorsque j'exécute la requête suivante :
select to_date ('30092017', 'YYYYMMDD');
  to_date
------------
3010-08-19
(1 ligne)

De ce fait, je suis amené à revoir ce type de contrôle.

Quelle explication donner à ce résultat ?

Comment peut-on effectuer ce contrôle différemment et efficacement ?

D'avance merci de votre retour.

Hors ligne

#2 15/11/2017 18:25:49

dverite
Membre

Re : Fonction de controle de date valide

C'est un problème connu, je crois que ça ne sera jamais corrigé dans cette fonction pour  rester "bug-compatible" parce qu'elle fait ça depuis toujours.

Dans le code ci-dessus il devrait suffire de faire:

RETURN to_char(V_Dat, 'YYYYMMDD') = P_VAR;

à la place de RETURN TRUE:

Hors ligne

Pied de page des forums