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

  1. #1
    Membre confirmé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Points : 475
    Points
    475
    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 éminent

    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
    Points : 7 740
    Points
    7 740
    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
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

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

    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
    Points : 7 740
    Points
    7 740
    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
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Points : 220
    Points
    220
    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 averti 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 : 42
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 277
    Points : 436
    Points
    436
    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 averti
    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
    Points : 342
    Points
    342
    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 averti 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 : 42
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 277
    Points : 436
    Points
    436
    Par défaut
    Citation Envoyé par jmguiche Voir le message
    Ben, une date est toujours valide, sinon, ce n'est pas une date.

    Certes…

    Citation Envoyé par jmguiche Voir le message
    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 ?
    Cela a pu changer entre temps…

  8. #8
    Membre averti
    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
    Points : 342
    Points
    342
    Par défaut
    Citation Envoyé par ner0lph Voir le message
    Certes…


    Cela a pu changer entre temps…
    Depuis mai 2007 ? ben non.

  9. #9
    Membre averti 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 : 42
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 277
    Points : 436
    Points
    436
    Par défaut
    Je ne suis pas spécialiste Oracle et suivre de près la sortie des nouvelles versions d'Oracle ne m'intéresse pas.
    Néanmoins, je suis en droit d'imaginer qu'Oracle peut évoluer…

  10. #10
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    bon, il n'existe pas de version toute cuite...

    Si on est vraiment pervers, on peut le tenter en XML

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    create table t(d varchar2(100));
    insert into t values ('2008-01-31');
    insert into t values ('2008-02-31');
    select d, xmlquery(
      'let $i:=if($X castable as xs:date)then "TRUE" else "FALSE" return $i' 
        passing sys_xmlgen(D) as x returning content
        ).getStringVal() isValidDate 
    from t;
    D           ISVALIDDATE
    ----------- -----------
    2008-01-31  TRUE       
    2008-02-31  FALSE

  11. #11
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    J'aime ! Est-ce performant ?

  12. #12
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    non, pas du tout

  13. #13
    Membre averti
    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
    Points : 342
    Points
    342
    Par défaut
    En java, personne ne veut essayer ?
    (cela ne sera pas performant non plus !)

  14. #14
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Bref, une solution non performante mais qui exploite d’une manière inhabituelle des autres fonctionnalités reste toujours intéressante. Merci Laurent.

  15. #15
    Membre chevronné

    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
    Points : 1 775
    Points
    1 775
    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.
    Modérateur des forums Oracle et Langage SQL
    Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum

+ 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