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

Requêtes MySQL Discussion :

Select > Case > When CHAR_LENGTH


Sujet :

Requêtes MySQL

Vue hybride

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

    Informations forums :
    Inscription : Octobre 2009
    Messages : 14
    Par défaut Select > Case > When CHAR_LENGTH
    Bonjour à vous,

    Dans ma base j'ai un champs "date_in" pour les visites d'entreprises. Voici comment cela se présente :
    {date_1ère_visite}|{nb_visites}|{SI > 1 visite ALORS date_dernière_visite}

    1 visite = 20131207|1
    2 visites = 20131207|2|20140124
    ...
    N visites = 20131207|N|20140205

    Je souhaite faire une requête qui puisse extraire toutes les entreprises de type "client" que je n'ai pas visité depuis plus de 6 mois
    C'est là que cela se complique... je souhaite donc tester quand {date_actuelle} - {date_dernière_visite} >= 180 sachant que {date_dernière_visite} peut aussi être la 1ère (si 1 seule) donc à droite ou à gauche du champs date_in

    J'essaye déjà de mettre dans une colonne les dates en gras de ci-dessus.
    La requête ci-dessous me renvoie "date_in" dans le champs date_dernière_visite créé pour l'occasion (donc qqch cloche) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT CASE 
    WHEN (CHAR_LENGTH( 'date_in' ) >12) THEN RIGHT( 'date_in', 8 )
    ELSE LEFT( 'date_in', 8 )
    END "date_dernière_visite"
    FROM entreprises
    WHERE commercial = 'moi'
    AND type = 'Client'
    Alors que je souhaite avoir :

    date_dernière_visite
    20131207
    20140124
    20140205
    ...
    Bien-sûr dans la finalité de faire le test :
    {date_actuelle} - {date_dernière_visite} >= 180

    Suis dans les choux ou pas loin ? Merci de ne pas m'envoyer de scud dans la tronche, je suis un développeur "amateur"
    Surtout merci d'avance pour votre aide

    Guillaume

    NB : oui je sais, j'aurais dû créer plusieurs champs distincts dans ma base, cela aurait facilité les choses...

  2. #2
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Saluton,

    Quel est le type de la colonne date_in ?

    20131207|2| pour moi ça fait 11 caractères.

    As-tu essayé, à tout hasard, avec CHAR_LENGTH(TRIM(date_in)) ?
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 14
    Par défaut
    Merci Maljuna Kris

    Quel est le type de la colonne date_in ?
    VARCHAR

    20131207|2| pour moi ça fait 11 caractères.
    Oui mais c'est pas important, 1 visite = 10 caractères et >1 visite = 19 caractères
    On peut faire le test de 11 à 18 en fait...

    As-tu essayé, à tout hasard, avec CHAR_LENGTH(TRIM(date_in)) ?
    Non je vais me renseigner
    EDIT > à priori ce n'est pas la bonne direction

    Nouvelle requête sans plus de résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT CASE CHAR_LENGTH('date_in')
    WHEN 10 THEN 'test1'
    WHEN 19 THEN 'test2'
    END AS 'date_derniere_visite'
    FROM entreprises
    WHERE commercial = 'moi'
    Celle-ci est bonne ! Pas encore gagné mais je me rapproche du but...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT  CASE WHEN CHAR_LENGTH(date_in) > 12
                 THEN RIGHT(date_in, 8)
                 ELSE LEFT(date_in, 8)
            END 'date_derniere_visite'
    FROM    entreprises
    WHERE commercial = 'moi'
    AND (((CURDATE() + 0) - 'date_derniere_visite') > 180)

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 14
    Par défaut Réponse
    Pour ceux que cela intéressent, voici "presque" la réponse à ma question de départ à savoir :
    "Je veux savoir quelles sont les entreprises clientes que je n'ai pas visité depuis longtemps"
    (exprimé en nombre de mois décroissants par rapport à la date du jour)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT entreprise,
    CASE WHEN CHAR_LENGTH( date_in ) >12
    THEN TIMESTAMPDIFF(
    MONTH , RIGHT( date_in, 8 ) , CURDATE( ) +0 )
    ELSE TIMESTAMPDIFF(
    MONTH , LEFT( date_in, 8 ) , CURDATE( ) +0 )
    END AS 'date_derniere_visite'
    FROM entreprises
    WHERE commercial = 'moi'
    AND TYPE = 'Client'
    ORDER BY `date_derniere_visite` DESC
    C'est pas encore vraiment le cas donc je ne mentionne pas "RESOLU"...

  5. #5
    Membre émérite Avatar de ypcman
    Homme Profil pro
    Retraité codeur !
    Inscrit en
    Janvier 2011
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité codeur !
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 601
    Par défaut
    Bonjour.
    Il me semble plus judicieux de créer un vrai champ date_derniere_visite de type date (YYYY-MM-DD) pour la date de la dernière visite puis de mettre à jour ce champ avec une requête comme
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE entreprises
    SET date_derniere_visite=CONCAT(SUBSTR(IF(CHAR_LENGTH(date_in) > 12,RIGHT(date_in, 8),LEFT(date_in, 8)),1,4),'-',SUBSTR(IF(CHAR_LENGTH(date_in) > 12,RIGHT(date_in, 8),LEFT(date_in, 8)),5,2),'-',SUBSTR(IF(CHAR_LENGTH(date_in) > 12,RIGHT(date_in, 8),LEFT(date_in, 8)),7,2)) 
    WHERE commercial = 'moi'
    Il y a peut-être une erreur dans les chiffres, j'ai écris cela de tête
    Ensuite, il ne te reste plus qu'à comparer cette date avec la date courante par une requête comme
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT nom_entreprise, date_derniere_visite 
    FROM entreprises
     WHERE ADDDATE(date_derniere_visite INTERVAL 6 MONTH) < NOW()

    Yves

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 14
    Par défaut
    Merci Yves

    Oui c'est vrai, comme mentionné dans mon NB du 1er post
    En fait je voulais ne pas trop multiplier les champs dans ma table, mais je crois que c'est un mauvais calcul finalement.

    Ceci dit, ma dernière requête fonctionne et répond presque au sujet d'origine

  7. #7
    Membre émérite Avatar de ypcman
    Homme Profil pro
    Retraité codeur !
    Inscrit en
    Janvier 2011
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité codeur !
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 601
    Par défaut
    Bonjour.
    Tu peux aussi n'avoir qu'une seule requête mais c'est moins élégant :
    Code mysql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT entreprise, 
    CONCAT(SUBSTR(IF(CHAR_LENGTH(date_in) > 12,RIGHT(date_in, 8),LEFT(date_in, 8)),1,4),'-',SUBSTR(IF(CHAR_LENGTH(date_in) > 12,RIGHT(date_in, 8),LEFT(date_in, 8)),5,2),'-',SUBSTR(IF(CHAR_LENGTH(date_in) > 12,RIGHT(date_in, 8),LEFT(date_in, 8)),7,2))  AS date_derniere_visite
    FROM entreprises 
    WHERE ADDDATE('date_derniere_visite' INTERVAL 6 MONTH) < NOW()
    ORDER BY 'date_derniere_visite' DESC

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 14
    Par défaut
    Merci ypcman

Discussions similaires

  1. Réponses: 4
    Dernier message: 20/11/2012, 12h54
  2. Réponses: 5
    Dernier message: 24/10/2008, 09h20
  3. Réponses: 10
    Dernier message: 13/02/2006, 15h29
  4. [PL/SQL] CASE xxx WHEN NULL
    Par Loko dans le forum Oracle
    Réponses: 5
    Dernier message: 06/12/2004, 10h40
  5. [select dans case] reconnaitre un champ d une table liée
    Par the_edge dans le forum MS SQL Server
    Réponses: 14
    Dernier message: 22/10/2004, 16h47

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