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 :

Erreur de conversion bizarre dans une requête


Sujet :

Développement SQL Server

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 310
    Points : 157
    Points
    157
    Par défaut Erreur de conversion bizarre dans une requête
    Bonjour à tous,

    Voici le problème que j'ai dont je n'arrive pas à comprendre la raison

    J'ai une vue VUE1 qui ramene des champs dont PeriodeMois qui peut contenir 'Janvier', 'Février' etc ainsi qu'un champ PeriodeAnnee qui contient l'année

    je fais un select de cette vue de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select 
    CONVERT(DATETIME,'01 '+PeriodeMois+' '+cast(PeriodeAnnee as varchar)) as toto
    FROM VUE1
    Il me renvoie 4000 lignes sans souci avec la conversion exacte

    Maintenant je rajoute ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select 
    CONVERT(DATETIME,'01 '+PeriodeMois+' '+cast(PeriodeAnnee as varchar)) as toto
    FROM VUE1
    WHERE CONVERT(DATETIME,'01 '+PeriodeMois+' '+cast(PeriodeAnnee as varchar)) = GETDATE()
    Il me met le message d'erreur suivant :
    Msg*241, Niveau*16, État*1, Ligne*1
    Échec de la conversion d'une valeur datetime à partir d'une chaîne de caractères.
    Comment il peut me sortir une erreur de datetime sachant que j'arrive à convertir dans un select simple ? o_O

    merci d'avance.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 056
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 056
    Points : 1 216
    Points
    1 216
    Par défaut
    bonjour,

    Je songerais à une donnée incorrecte dans la table qui fait que le convert ne passe pas.... mais si le select sans where ne retourne aucune erreur, ceci est bizarre.

    Si vous avez la possibilité de stocker tout ça dans un champ DATETIME, votre vie en serait simplifiée

    Même si la clause where fonctionnait, je pense qu'elle ne retournerait rien sauf si par une chance insensée vous exécutez la requête quand getdate() retourne jj-mm-aaaa 00:00:00.000. En effet, le convert génère votre date avec jj-mm-aaaa 00:00:00.000.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 310
    Points : 157
    Points
    157
    Par défaut
    justement la vue sert à obtenir que les lignes de la table dont les données sont correctes !

    je ne comprend pas comment le select fonctionne alors que le where plante :s

  4. #4
    Membre émérite

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Points : 2 856
    Points
    2 856
    Par défaut
    Citation Envoyé par SoaB Voir le message
    Bonjour à tous,
    WHERE CONVERT(DATETIME,'01 '+PeriodeMois+' '+cast(PeriodeAnnee AS varchar)) = GETDATE()
    Essaye de convertir également de GETDATE().

    Pourquoi ? parce que
    donne ceci comme format :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    2010-04-30 12:56:28.993
    alors que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CONVERT(DATETIME,'01 '+PeriodeMois+' '+cast(PeriodeAnnee AS varchar))
    est un autre format !
    A+
    Etienne ZINZINDOHOUE

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 310
    Points : 157
    Points
    157
    Par défaut
    Ceci plante aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT 
    CONVERT(DATETIME,'01 '+PeriodeMois+' '+cast(PeriodeAnnee AS varchar)) AS toto
    FROM VUE1
    WHERE CONVERT(DATETIME,'01 '+PeriodeMois+' '+cast(PeriodeAnnee AS varchar)) = CONVERT(DATETIME,'01 '+PeriodeMois+' '+cast(PeriodeAnnee AS varchar))
    donc je ne pense pas que le problème vienne de GetDate

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 056
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 056
    Points : 1 216
    Points
    1 216
    Par défaut
    est-ce qu'on peut avoir la structure de la table et le code de la vue ?
    merci

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 310
    Points : 157
    Points
    157
    Par défaut
    dès lundi je posterais.

    Mais en gros dans la table il y a un champ alphanumérique dont le format est AAAA/MM ou MM/AAAA

    La vue fait un convert de ça en date en rajoutant "01/" devant pour chaque ligne dont le ISDATE('01/'+Champ)=1

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 310
    Points : 157
    Points
    157
    Par défaut
    J'ai trouvé la solution même si je ne comprend toujours pas pourquoi

    dans ma vue j'ai

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT CAST('01/'+Periode as datetime) as PeriodeDate 
    FROM TABLE
    WHERE ISDATE('01/'+Periode) = 1
    Pour rappel le SELECT fonctionnait sur la vue mais dès que je faisais un WHERE ça plantait.

    j'ai donc fais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT CASE ISDATE('01/'+Periode)
                WHEN 1 THEN CAST('01/'+Periode) AS DATETIME
                ELSE NULL
              END as PeriodeDate
    FROM TABLE
    WHERE ISDATE('01/'+Periode) = 1
    Et maintenant je peux faire un WHERE sur ce champ de ma vue.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 05/11/2009, 12h09
  2. [MySQL] Erreur dans une requête sql
    Par Goundy dans le forum PHP & Base de données
    Réponses: 37
    Dernier message: 30/01/2006, 16h08
  3. Réponses: 6
    Dernier message: 29/11/2005, 19h36
  4. Erreur d'agrégation dans une requête UNION
    Par soso78 dans le forum Access
    Réponses: 2
    Dernier message: 05/10/2005, 00h11
  5. [VBA] Erreur dans une requête
    Par Damsou dans le forum Access
    Réponses: 31
    Dernier message: 21/06/2005, 17h04

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