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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 192
    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
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    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, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 192
    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
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    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, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 192
    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 : 43
    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
    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.

    @++

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