Vous n'êtes pas identifié(e).
Pages : 1
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
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:
@DanielVerite
http://blog-postgresql.verite.pro/
Hors ligne
Pages : 1