IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

tester si date valide ou pas


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Par défaut tester si date valide ou pas
    bonjour les gens, voila je pense que tout est dans le topic.
    j'ai beau chercher sur le forum je ne trouve pas de fonction pour tester si une date est valide ou pas, à croire que ça n'existe pas (plsql)

  2. #2
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE OR REPLACE FUNCTION wmc_f_test_date (p_date IN VARCHAR2, p_format IN VARCHAR2 DEFAULT 'DD/MM/RRRR')
    RETURN BOOLEAN
    IS
    	v_date DATE;
    BEGIN
    	v_date := TO_DATE(p_date, p_format);
    	RETURN TRUE;
    EXCEPTION
    WHEN OTHERS THEN RETURN FALSE;
    END;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    BEGIN
    	IF wmc_f_test_date('31.01.2007', 'DD.MM.YYYY')
    	THEN 
    		dbms_output.put_line('31.01.2007' || ' Ok');
    	ELSE
    		dbms_output.put_line('31.01.2007' || ' KO');
    	END IF;
     
    	IF wmc_f_test_date('31.02.2007', 'DD.MM.YYYY')
    	THEN 
    		dbms_output.put_line('31.02.2007' || ' Ok');
    	ELSE
    		dbms_output.put_line('31.02.2007' || ' KO');
    	END IF;
    END;
    31.01.2007 Ok
    31.02.2007 KO

  3. #3
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    En faisant mes tests j'ai trouvé hallucinant ce qu'oracle considère comme bon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT TO_DATE('31*0107', 'DD/MM/RRRR')
    		FROM dual

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Par défaut
    Citation Envoyé par McM
    En faisant mes tests j'ai trouvé hallucinant ce qu'oracle considère comme bon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT TO_DATE('31*0107', 'DD/MM/RRRR')
    		FROM dual
    Hallucinant !

    On pourrait ajouter dans la fonction de test une comparaison de la chaine passée en paramètre avec un TO_CHAR(TO_DATE()) de cette même chaîne avec le même format, pour vérifier que la chaîne est bien au format fourni :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    CREATE OR REPLACE FUNCTION wmc_f_test_date (p_date IN VARCHAR2, p_format IN VARCHAR2 DEFAULT 'DD/MM/RRRR')
    RETURN BOOLEAN
    IS
        v_date VARCHAR2(50);
    BEGIN
        v_date := TO_CHAR(TO_DATE(p_date, p_format), p_format);
        IF (v_date = p_date) THEN
    	RETURN TRUE;
        ELSE
            RETURN FALSE;
        END IF;
    EXCEPTION
        WHEN OTHERS THEN 
            RETURN FALSE;
    END;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    rbaraer@Ora10g> BEGIN
      2     IF wmc_f_test_date('31.01.2007', 'DD.MM.YYYY')
            THEN
      3    4                dbms_output.put_line('31.01.2007' || ' DD.MM.YYYY' || ' Ok');
      5     ELSE
      6             dbms_output.put_line('31.01.2007' || ' DD.MM.YYYY' || ' KO');
      7     END IF;
      8
      9     IF wmc_f_test_date('31.02.2007', 'DD.MM.YYYY')
     10     THEN
     11             dbms_output.put_line('31.02.2007' || ' DD.MM.YYYY' || ' Ok');
     12     ELSE
     13             dbms_output.put_line('31.02.2007' || ' DD.MM.YYYY' || ' KO');
     14     END IF;
     15
     16      IF wmc_f_test_date('31.01.2007', 'DD/MM/YYYY')
     17     THEN
     18             dbms_output.put_line('31.01.2007' || ' DD/MM/YYYY' || ' Ok');
     19     ELSE
     20             dbms_output.put_line('31.01.2007' || ' DD/MM/YYYY' || ' KO');
     21     END IF;
     22
     23      IF wmc_f_test_date('31*0107', 'DD/MM/RRRR')
     24     THEN
     25             dbms_output.put_line('31*0107' || ' DD/MM/RRRR' || ' Ok');
     26     ELSE
     27             dbms_output.put_line('31*0107' || ' DD/MM/RRRR' || ' KO');
     28     END IF;
     29  END;
     30  /
    31.01.2007 DD.MM.YYYY Ok
    31.02.2007 DD.MM.YYYY KO
    31.01.2007 DD/MM/YYYY KO
    31*0107 DD/MM/RRRR KO
     
    PL/SQL procedure successfully completed.
     
    rbaraer@Ora10g>
    rbaraer

  5. #5
    Membre éclairé Avatar de ner0lph
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2005
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 277
    Par défaut Et en SQL pur ?
    Salut,

    Désolé de remonter, mais concernant le fait de tester la validité d'une date, n'existe-t-il vraiment pas une fonction en Oracle 10g qui le fait, à l'instar de la fonction ISDATE de MS SQL Server ?


  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Août 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 270
    Par défaut
    Ben, une date est toujours valide, sinon, ce n'est pas une date.



    Vérifier qu'une chaine de caractere correspond à une date donnée, il y a to_date, si cela déclenche une exception, c'est que la chaine ne correspond pas à une date, en tout cas, pas au format proposé.

    Une fonction qui rend un booleen vrai si c'est une date, faux sinon... A ton avis, si cela existait, pense tu vraiment que les posteurs précédents proposeraient des fonctions PL pour le faire ?

  7. #7
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Par défaut
    Citation Envoyé par McM Voir le message
    En faisant mes tests j'ai trouvé hallucinant ce qu'oracle considère comme bon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT TO_DATE('31*0107', 'DD/MM/RRRR')
    		FROM dual
    Vu sur AksTom, il faut apparemment utiliser "FX" pour gérer ce genre de cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT TO_DATE('31*0107', 'DD/MM/RRRR') FROM dual;
    SELECT TO_DATE('31*0107', 'fxDD/MM/RRRR') FROM dual;
    produit :

    TO_DATE('31*0107','DD/MM/RRRR')
    -------------------------
    31/01/07


    Erreur commençant à la ligne 2 de la commande :
    SELECT TO_DATE('31*0107', 'fxDD/MM/RRRR') FROM dual
    Rapport d'erreur :
    Erreur SQL : ORA-01861: le littéral ne concorde pas avec le format chaîne de caractères
    01861. 00000 - "literal does not match format string"
    *Cause: Literals in the input must be the same length as literals in
    the format string (with the exception of leading whitespace). If the
    "FX" modifier has been toggled on, the literal must match exactly,
    with no extra whitespace.
    *Action: Correct the format string to match the literal.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 28/11/2012, 10h42
  2. [XML][Tutoriel]Valide ou pas ?
    Par mavina dans le forum XML/XSL et SOAP
    Réponses: 6
    Dernier message: 15/06/2006, 09h30
  3. obtenir toutes les dates valides comprises entre dates
    Par captainamerica75 dans le forum VBA Access
    Réponses: 3
    Dernier message: 01/06/2006, 13h25
  4. Tester la valeur(float ou pas) d'un input text
    Par Battosaiii dans le forum Général JavaScript
    Réponses: 23
    Dernier message: 16/04/2006, 10h47
  5. [W3C] Valide W3C? Pas si simple qu'il y parait...
    Par Zenol dans le forum Balisage (X)HTML et validation W3C
    Réponses: 14
    Dernier message: 17/12/2005, 13h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo