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

Développement SQL Server Discussion :

Convert dans le where


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 192
    Points : 47
    Points
    47
    Par défaut Convert dans le where
    Est ce possible de mettre la clause convert (ou cast) dans un where ?
    ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Select CONVERT(datetime,valeur,103) as date from TABL where
    valeur > '01/10/2008' and isdate(valeur) = 1
    Si oui comment ? Car j'ai un format initial en varchar ou seulement pour les valeurs que l'on peut accaparer a une date, je veux les transformer en date time pour ensuite en afficher que certaine selon mon critere ..

    Merci

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Quel SGBD ?
    Voir dans l'aide de celui-ci s'il existe une fonction du style ISDATE et utiliser un CASE.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 192
    Points : 47
    Points
    47
    Par défaut
    Ma requete affiche des valeurs,
    qui à la base sont des champs vides, des chaines de caracteres, des nombres ou des dates.
    Grace a isdate et isnumeric, j'arrive à ne retenir que les dates.
    Donc j'arrive à afficher toutes mes valeurs qui sont des dates

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select * from parc_materiel_caracteristiques 
    	where isdate(valeur)= 1 and isnumeric(valeur) =0
    	order by no_critere
    Le souci vient au moment ou je veux ajouter le critere de periode.
    C'est à dire, m'afficher les valeurs entre une date et une autre.
    la il plante car malgré le isdate(valeur)= 1 and isnumeric(valeur) =0
    Il essaye de me convertir des valeurs inexistantes en datetime, et ca me fait planter.
    Quelqu'un a une idée ? Une petite fonction qui traine serait parfaite

    J'ai essayé avec une sous requete..
    C'est à dire que je selectionne toutes mes valeurs, sauf celle qui sont mauvaise ..
    Et meme l'inverse .. je selectionne toutes mes valeurs, et je garde queles bonnes ..

    MARCHE :

    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
    Select valeur as date 
    from 
    parc_materiel_caracteristiques as t1 ,
    parc_criteres as t2,
    agence as t3,
    parc_materiel as t4, 
    parc_type_materiel as t5 
    where t1.no_critere = t2.no_critere 
    and t3.num_agence = t4.num_agence 
    and t1.num_mat = t4.num_materiel
    and t5.num_type_mat = t4.num_type_mat
    and valeur 
    not in (select valeur from parc_materiel_caracteristiques 
    	where (isdate(valeur) = 0 and isnumeric(valeur) = 0 )
    	   or (isdate(valeur) = 0 and isnumeric(valeur) = 1 )
    	   or (isdate(valeur) = 1 and isnumeric(valeur) = 1 ))
    MARCHE PAS

    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
    Select valeur as date 
    from 
    parc_materiel_caracteristiques as t1 ,
    parc_criteres as t2,
    agence as t3,
    parc_materiel as t4, 
    parc_type_materiel as t5 
    where t1.no_critere = t2.no_critere 
    and t3.num_agence = t4.num_agence 
    and t1.num_mat = t4.num_materiel
    and t5.num_type_mat = t4.num_type_mat
    and valeur 
    not in (select valeur from parc_materiel_caracteristiques 
    	where (isdate(valeur) = 0 and isnumeric(valeur) = 0 )
    	   or (isdate(valeur) = 0 and isnumeric(valeur) = 1 )
    	   or (isdate(valeur) = 1 and isnumeric(valeur) = 1 ))
    and valeur
    between convert(varchar,'01/06/2009', 103) 
    and convert(varchar,'31/12/2009', 103)
    order by convert(datetime, valeur, 103) asc

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Beurk ces requêtes !

    Depuis 1992, la syntaxe pour les jointures est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FROM TableA
    JOIN TableB ON condition de jointure
    Pour le reste, il faut chercher les fonctions de date propre à votre SGBD.

    La requête ci-dessous donne une piste pour MySQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT valeur AS 'Date' 
    FROM parc_materiel_caracteristiques AS t1 
    INNER JOIN parc_criteres AS t2 ON t1.no_critere = t2.no_critere
    INNER JOIN parc_materiel AS t4 ON t1.num_mat = t4.num_materiel
      INNER JOIN agence AS t3 ON t3.num_agence = t4.num_agence
        INNER JOIN parc_type_materiel AS t5 ON t5.num_type_mat = t4.num_type_mat
    WHERE LENGTH(DATE(STR_TO_DATE(valeur, '%d/%m/%Y'))) IS NOT NULL
      AND STR_TO_DATE(valeur, '%d/%m/%Y') BETWEEN '2009-06-01' AND '2009-12-31'
    ORDER BY STR_TO_DATE(valeur, '%d/%m/%Y')
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 192
    Points : 47
    Points
    47
    Par défaut
    la meme requete sous SQL serveur, ca donnerait quoi ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    WHERE LENGTH(DATE(convert(datetime, valeur,103))) IS NOT NULL
      AND STR_TO_DATE(valeur, '%d/%m/%Y') BETWEEN '2009-06-01' AND '2009-12-31'
    ORDER BY STR_TO_DATE(valeur, '%d/%m/%Y')
    Sinon merci pour les jointures

  6. #6
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Vous n'avez aucun intérêt à tester la longueur de la date si la longueur de la chaine est nulle.
    En outre je ne vois pas comment une longueur peut ne pas avoir de valeur (NULL).

    La requête sous SQL Server devient donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    WHERE LEN(valeur) > 0
    AND CONVERT(DATETIME, valeur, 112) BETWEEN '20090601' AND '20091231'
    ORDER BY CONVERT(DATETIME, valeur, 112)
    Le style d'affichage de date 112 correspond au format ISO, qui fonctionne toujours sur toutes les plateformes et langages.

    @++

  7. #7
    Membre confirmé Avatar de agemis31
    Profil pro
    DBA
    Inscrit en
    Octobre 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : DBA

    Informations forums :
    Inscription : Octobre 2007
    Messages : 399
    Points : 478
    Points
    478
    Par défaut
    Bonsoir,

    Ce n'est pas si simple que ça. Dans la suite de AND, le moteur évalue n'évalue pas forcément les conditions les unes après les autres en sortant dès qu'il trouve 'faux'.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    declare @t table (valeur varchar(20))
    insert into @t select null 
    union select '20090101'
    union select ''
    union select '20090618'
    --aille
    union select 1
     
    SELECT * from @t WHERE LEN(valeur) > 0
    AND ISDATE(valeur) = 1
    AND CONVERT(DATETIME, valeur, 112) BETWEEN '20090601' AND '20091231'
    ORDER BY CONVERT(DATETIME, valeur, 112)
    Par contre, l'idée de CinePhil semble fonctionner:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT valeur 
    FROM
    (
    SELECT CASE WHEN ISDATE(valeur) = 1 THEN CONVERT(DATETIME, valeur, 112) ELSE NULL END 
    from @t 
    ) A (valeur)
    WHERE 
    valeur BETWEEN '20090601' AND '20091231'
    ORDER BY valeur
    @+

  8. #8
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Effectivement, BRAVO le moteur, ça ne marche pas non plus avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT valeur
    FROM
    (
    	SELECT valeur
    	FROM @t
    	WHERE LEN(valeur) > 0
    ) AS T
    WHERE CONVERT(DATETIME, valeur, 112) BETWEEN '20090601' AND '20091231'
    ORDER BY CONVERT(DATETIME, valeur, 112)
    Bien vu

    @++

  9. #9
    Membre confirmé Avatar de agemis31
    Profil pro
    DBA
    Inscrit en
    Octobre 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : DBA

    Informations forums :
    Inscription : Octobre 2007
    Messages : 399
    Points : 478
    Points
    478
    Par défaut
    D'ailleurs, et spécialement pour toi :-), de mémoire, ca ne marche pas non plus avec une cte, on ne force pas un ordre d'évaluation comme ça. Il semble qu'on doive agir sur les colonnes et pas sur la condition.

    @+

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 192
    Points : 47
    Points
    47
    Par défaut
    Merci pour vos réponses, mais aucune n'est encore correcte.
    Explications :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select *, len(valeur) as NB, convert(datetime, valeur, 112) as date from parc_materiel_caracteristiques
    where len(valeur) = 10 and isdate(valeur) = 1 and isnumeric(valeur)= 0
    Il ne comprend pas la valeur 112 et me retourne :

    Échec de la conversion d'une valeur datetime à partir d'une chaîne de caractères.
    Le style d'affichage de date 112 correspond au format ISO, qui fonctionne toujours sur toutes les plateformes et langages.
    Ba pas chez moi



    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
    declare @t TABLE (valeur varchar(20))
    INSERT INTO @t SELECT NULL 
    union SELECT '20090101'
    union SELECT ''
    union SELECT '20090618'
    --aille
    union SELECT 1
     
    SELECT * FROM @t 
    where ISDATE(valeur) = 1
    AND CONVERT(DATETIME, valeur, 103) BETWEEN '20090601' AND '20091231'
    ORDER BY CONVERT(DATETIME, valeur, 103)
     
    SELECT valeur 
    FROM
    (
    SELECT CASE WHEN ISDATE(valeur) = 1 THEN CONVERT(DATETIME, valeur, 112) ELSE NULL END 
    FROM @t 
    ) A (valeur)
    WHERE 
    valeur BETWEEN '20090601' AND '20091231'
    ORDER BY valeur
    Pour la requete ci dessus, j'ai l'erreur suivante :

    Msg*241, Niveau*16, État*1, Ligne*9
    Échec de la conversion d'une valeur datetime à partir d'une chaîne de caractères.
    Et ca ne marche pas non plus avec l'ensemble des requetes que vous m'avez indiqué ...
    j'ai eu a chaque fois le meme message d'erreur ..

    Pour moi cela vient du faite qu'il essaye de comparer malgré les conditions la valeur AND (qui n'est pas forcément une valeur comparable a un datetime) aux valeurs de date..

    Ceci est d'autant plus vrai que lorsque j'élimine les champs tel que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    and t1.no_critere <> 33
    and t1.no_critere <> 38
    and t1.no_critere <> 42
    ma requete fonctionne.

    Les champs 33, 38 et 42 contiennent : Null ou des chaines de caractères

  11. #11
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    Je ne voit pas pourquoi vous prenez tous le mauvais chemin. SQL Server est suffisament intelligent pour répondre à la bonne question.

    Lorsque vous tentez de convertir la colonne en date cela risque effectivement de planter.

    Il vaudrait mieux tester avec ISDATE puis convertir le chaine en date et non la colonne en date !

    Quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT valeur AS MaDate 
    FROM TABL 
    WHERE valeur > CAST('20081001' AS DATE)
    AND isdate(valeur) = 1
    Lisez ce que j'ai écrit à ce sujet : http://blog.developpez.com/sqlpro/p5...lle-intellige/

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 192
    Points : 47
    Points
    47
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT valeur AS MaDate 
    FROM parc_materiel_caracteristiques 
    WHERE valeur > CAST('20081001' AS DATE)
    AND isdate(valeur) = 1
    ERREUR, Date n'est pas connu. j'imagine que tu voulais mettre datetime ... J'essaye donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT valeur AS MaDate 
    FROM parc_materiel_caracteristiques 
    WHERE valeur > CAST('20081001' AS DATEtime)
    AND isdate(valeur) = 1
    ERREUR : Msg*241, Niveau*16, État*1, Ligne*1
    Échec de la conversion d'une valeur datetime à partir d'une chaîne de caractères.
    L'erreur basic

  13. #13
    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
    Citation Envoyé par elsuket Voir le message
    Le style d'affichage de date 112 correspond au format ISO, qui fonctionne toujours sur toutes les plateformes et langages.
    Je n'ai retrouvé que le format ISO 8601 : YYYY-MM-DD.
    Y'en a-t'il un autre ?

  14. #14
    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
    Et que donne ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT PMC.valeur FROM
        (
        SELECT valeur 
        FROM parc_materiel_caracteristiques 
        WHERE isdate(valeur) = 1
        ) as PMC
    WHERE PMC.valeur > CAST('20081001' AS DATEtime)

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 192
    Points : 47
    Points
    47
    Par défaut
    Msg*241, Niveau*16, État*1, Ligne*1
    Échec de la conversion d'une valeur datetime à partir d'une chaîne de caractères.

    Comme d'habitude..
    je te donne le lien pour les normdes de convert et cast

    http://msdn.microsoft.com/fr-fr/libr...s,SQL.80).aspx

  16. #16
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TABLE TBL (valeur VARCHAR(16))
     
    INSERT INTO TBL VALUES ('20081001');
    INSERT INTO TBL VALUES ('zzzzzzzz');
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT valeur AS MaDate 
    FROM TBL 
    WHERE isdate(valeur) = 1
      AND valeur = '20081001'
     
    MaDate
    ----------------
    20081001
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT CAST(valeur AS DATETIME) AS MaDate 
    FROM TBL 
    WHERE isdate(valeur) = 1
      AND valeur = '20081001'
     
    MaDate
    -----------------------
    2008-10-01 00:00:00.000
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 192
    Points : 47
    Points
    47
    Par défaut
    Bien sur que ca marchera si je change tout.
    Le souci vient du fait que je ne peux pas changer les champs de ma table.

    C'est à dire : valeur - varchar(100) - null autorisé

    Je ne suis que stagiaire.
    Le convert marche sauf quand il est dans mon champs where


    Cette requête marche mais c'est de la triche car j'élimine les 3 criteres qui me font merde.

    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
    Select nom_materiel, valeur as date , libelle , nom_agence, nom_type_mat
    from 
    parc_materiel_caracteristiques as t1 ,
    parc_criteres as t2,
    agence as t3,
    parc_materiel as t4, 
    parc_type_materiel as t5 
    where t1.no_critere = t2.no_critere 
    and isdate(valeur) = 1 and isnumeric(valeur) = 0 
    and t1.no_critere <> 33
    and t1.no_critere <> 38
    and t1.no_critere <> 42 
    and t3.num_agence = t4.num_agence 
    and t1.num_mat = t4.num_materiel
    and t5.num_type_mat = t4.num_type_mat
    and convert(smalldatetime , valeur, 103)
    between convert(varchar, '01/06/2009', 103) 
    and convert(varchar, '31/12/2009', 103)
    order by date asc

    ICI j'ai tenté de selectionné tout ce qui était mauvais(sous requete) et ensuite de ne garder que ce qui ne faisait pas partie de ca...
    Bilan : erreur au niveau du between ..(en gros le convert)
    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
    Select nom_materiel, valeur as date , libelle , nom_agence, nom_type_mat
    from 
    parc_materiel_caracteristiques as t1 ,
    parc_criteres as t2,
    agence as t3,
    parc_materiel as t4, 
    parc_type_materiel as t5 
    where t1.no_critere = t2.no_critere 
    and t3.num_agence = t4.num_agence 
    and t1.num_mat = t4.num_materiel
    and t5.num_type_mat = t4.num_type_mat
    and valeur 
    not in (select valeur from parc_materiel_caracteristiques 
    	where (isdate(valeur) = 0 and isnumeric(valeur) = 0 )
    	   or (isdate(valeur) = 0 and isnumeric(valeur) = 1 )
    	   or (isdate(valeur) = 1 and isnumeric(valeur) = 1 ))
    and valeur
    between convert(varchar, '01/06/2009', 103) 
    and convert(varchar, '31/12/2009', 103)
    order by convert(datetime, valeur, 103) asc

    --LES MAUVAIS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select * from parc_materiel_caracteristiques 
    	where (isdate(valeur)=0 and isnumeric(valeur)=0)
    		or (isdate(valeur)=0 and isnumeric(valeur)=1)
    		or (isdate(valeur)=1 and isnumeric(valeur)=1)
    	order by no_critere

    --LES BONS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select * from parc_materiel_caracteristiques 
    	where isdate(valeur)= 1 and isnumeric(valeur) =0
    	order by no_critere

  18. #18
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    les ricains disent :
    GARBAGE IN, GARBAGE OUT :
    que je traduirait par :
    De la merde en entrée tu as, de la merde en sortie tu obtiendra
    La seule solution viable, serait de revoir le modèle de données. Parce que à la monté en charge votre base va vous péter au nez !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 192
    Points : 47
    Points
    47
    Par défaut
    C'est la solution que je voulais pas entendre...

    Tant pis

    Merci

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 192
    Points : 47
    Points
    47
    Par défaut
    Je me pose une question tout de meme.
    Pourquoi est ce que la requete ci dessous 'fonctionne' (meme si le resultat est éronné)
    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
    select nom_materiel, valeur as date , libelle , nom_agence, nom_type_mat 
    from 
    parc_materiel_caracteristiques as t1 ,
    parc_criteres as t2,
    agence as t3,
    parc_materiel as t4, 
    parc_type_materiel as t5
    where t3.num_agence = t4.num_agence 
    and t1.no_critere = t2.no_critere 
    and t1.num_mat = t4.num_materiel
    and t5.num_type_mat = t4.num_type_mat 
    and isdate(valeur) = 1 and isnumeric(valeur) = 0 and Formatdate = 0
    and valeur
    between '01/06/2009' and '31/12/2009'
    order by convert(datetime,valeur,103)
    et que celle ci ne fonctionne pas :

    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
    select nom_materiel, valeur as date , libelle , nom_agence, nom_type_mat 
    from 
    parc_materiel_caracteristiques as t1 ,
    parc_criteres as t2,
    agence as t3,
    parc_materiel as t4, 
    parc_type_materiel as t5
    where t3.num_agence = t4.num_agence 
    and t1.no_critere = t2.no_critere 
    and t1.num_mat = t4.num_materiel
    and t5.num_type_mat = t4.num_type_mat 
    and isdate(valeur) = 1 and isnumeric(valeur) = 0 and Formatdate = 0
    and convert(datetime,valeur,103)
    between '01/06/2009' and '31/12/2009'
    order by convert(datetime,valeur,103)

Discussions similaires

  1. [2014] Comment enlever le convert dans le where ?
    Par olivtone dans le forum Développement
    Réponses: 7
    Dernier message: 05/03/2015, 10h57
  2. Problème de convert dans un where
    Par Jean-Marc68 dans le forum Linq
    Réponses: 4
    Dernier message: 08/09/2013, 16h04
  3. Plusieurs clauses OR dans le WHERE
    Par NeHuS dans le forum Langage SQL
    Réponses: 3
    Dernier message: 28/01/2005, 16h19
  4. 2 champs dans un where , possible en sql server ?
    Par voyageur dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 19/10/2004, 05h01
  5. Pb de convertion dans les procedures stockées
    Par Yannesco dans le forum SQL
    Réponses: 3
    Dernier message: 08/01/2004, 10h24

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