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

MS SQL Server Discussion :

Conversion d'un string en date dans une clause WHERE


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2011
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 36
    Par défaut Conversion d'un string en date dans une clause WHERE
    Bonjour,

    Je cherche actuellement à effectuer une requête en utilisant dans ma clause WHERE une date qui est enregistrée en tant que varchar.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT e.Numero_Echantillon, c.Resultat_Element , e.Date_Edition
    FROM dbo.Echantillon as e
    INNER JOIN dbo.Composer as c on c.Numero_Echantillon = e.Numero_Echantillon
    WHERE c.Code_Element_Echantillon = 15
    AND c.Resultat_Element > '01/01/2014'
    Or, "Resultat_Element" étant de type varchar, ma clause "WHERE" n'est pas appliquée.
    J'ai essayé plusieurs type de CAST/CONVERT mais sans succès :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT e.Numero_Echantillon, c.Resultat_Element , CONVERT(datetime, e.Date_Edition, 103)
    FROM dbo.Echantillon as e
    INNER JOIN dbo.Composer as c on c.Numero_Echantillon = e.Numero_Echantillon
    WHERE c.Code_Element_Echantillon = 15
    AND CAST(c.Resultat_Element as Datetime) > '01/01/2014'
    Cette requête me génère une erreur :

    Msg*241, Niveau*16, État*1, Ligne*2
    Échec de la conversion de la date et/ou de l'heure à partir d'une chaîne de caractères.
    Mes dates correspondant au champ Resultat_Element sont sous la forme : "25/03/2013"

    Auriez-vous une idée pour solutionner ma problématique ?

    Merci par avance.

    Cordialement,

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2008
    Messages
    699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Octobre 2008
    Messages : 699
    Par défaut
    C'est dégeu, mais c'est un point de départ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE substring(c.Code_Element_Echantillon,7,4)+substring(c.Code_Element_Echantillon,4,2)+substring(c.Code_Element_Echantillon,1,2) > '01/01/2014'
    Perso j’essaierais d'avoir une donnée au format AAAAMMJJ plutôt que jouer avec des concaténations

  3. #3
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Hello,

    Tu peux essayer de voir en utilisation l'option de session SET DATEFORMAT comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SET DATEFORMAT dmy;
    GO
     
    SELECT e.Numero_Echantillon, c.Resultat_Element , e.Date_Edition
    FROM dbo.Echantillon AS e
    INNER JOIN dbo.Composer AS c ON c.Numero_Echantillon = e.Numero_Echantillon
    WHERE c.Code_Element_Echantillon = 15
    AND CAST(c.Resultat_Element AS DATE) > '01/01/2014'
    Bien entendu il aurait mieux fallu stocker une date avec le bon type de données mais bon ...

    ++

  4. #4
    Membre averti
    Inscrit en
    Janvier 2011
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 36
    Par défaut
    Bonjour,

    J'ai essayé ta requête Mikedavem, et j'obtiens la même erreur que précédemment.
    Je suis bien d'accord que des données date enregistré en string c'est moyen... Mais je ne suis pas le créateur de l'application.

    Je ne comprends pas pourquoi il est si compliqué de cast en date une string qui est déjà au bon format...

    Vous auriez d'autres idées ?

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2008
    Messages
    699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Octobre 2008
    Messages : 699
    Par défaut
    Par ce qu'il est pas au bon format!
    C'est un string pas une date.

    Sinon, ma proposition ne marche pas non-plus ?

  6. #6
    Membre averti
    Inscrit en
    Janvier 2011
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 36
    Par défaut
    Ton idée ne fonctionne pas non.

    Msg*8116, Niveau*16, État*1, Ligne*2
    Le type de données de l'argument numeric n'est pas valide pour l'argument 1 de la fonction substring.
    Bon, j'ai essayé de prendre le problème autrement, et j'ai tenté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    REPLACE(c.Resultat_Element,'/','')
    Le but étant d'obtenir un nombre de type : 30082010

    J'ai ensuite essayé d'utiliser la fonction CONVERT, à savoir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CONVERT(Datetime, REPLACE(c.Resultat_Element,'/',''), 102)
    Mais encore une fois, sa ne fonctionne pas ...

    Msg*242, Niveau*16, État*3, Ligne*1
    La conversion d'un type de données varchar en type de données datetime a créé une valeur hors limites.
    Bref ... Une idée/solution ?

  7. #7
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Citation Envoyé par Florian54 Voir le message
    Bonjour,

    J'ai essayé ta requête Mikedavem, et j'obtiens la même erreur que précédemment.
    Je suis bien d'accord que des données date enregistré en string c'est moyen... Mais je ne suis pas le créateur de l'application.

    Je ne comprends pas pourquoi il est si compliqué de cast en date une string qui est déjà au bon format...

    Vous auriez d'autres idées ?
    J'en suis conscient et je ne te blâme pas ... simplement pour souligner qu'un mauvais choix de type de données entraîne toujours des problèmes supplémentaires

    C'est quand même étonnant que le SET DATEFORMAT ne fonctionne pas ici. Tu pourrais par hasard nous fournir le résultat de cette requête :

    Est-ce que toutes les valeurs de la colonne c.Resultat_Element sont elles bien dans le domaine de valeur autorisé ?

    ++

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    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 998
    Billets dans le blog
    6
    Par défaut
    La norme SQL impose 2 formats différents pour les dates exprimées sous forme de chaines de caractères :
    1) Format ISO court : AAAAMMJJ (aucun séparateur, année en premier sur 4 chiffres, puis mois sur 2 et jour sur 2).
    2) Format ISO long: AAAA-MM-JJ (séparateur le tiret, année en premier sur 4 chiffres, puis mois sur 2 et jour sur 2).
    Ce sont les seuls formats de date supportés quelque soit les configurations des serveurs et des sessions.
    Mieux vaut donc s'en tenir exclusivement à ces deux formats.

    Dans quel cas les utiliser :
    1) Format ISO court : DATETIME
    2) Format ISO long : DATETIME2, DATE, DATETIMEOFFSET

    Pourquoi ces différences ? MS SQL Server essaye de respecter la norme SQL au plus près.
    Le format ISO court était le format recommandé par la norme SQL jusqu'à la version SQL 2 de 1992. À cette époque SQL Server n'avait que le type DATETIME
    À partir de la norme SQL de 1999, le format a changé en ISO long. Or comme les types DATETIME2, DATE, DATETIMEOFFSET ont été introduits en 2008 par SQL Server, c'est désormais sur le format ISO long que ces nouveaux types reposent.

    NOTA : pour des raisons de précision, il faut éviter le type DATETIME et le convertir en DATETIME2. Le type DATETIME étant considéré comme obsolète.

    Bien entendu et comme dit par Mikedavem, vous pouvez préciser un autre format, à condition d'obliger votre session à le prendre en compte à l'aide du paramétrage SET DATEFORMAT.

    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/ * * * * *

Discussions similaires

  1. Conversion d'un String en Double dans une JSP
    Par demcoul dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 18/04/2012, 18h00
  2. Utiliser un alias de colonne dans une clause Where MS SQL
    Par sir dragorn dans le forum Langage SQL
    Réponses: 11
    Dernier message: 12/10/2011, 09h31
  3. Réponses: 1
    Dernier message: 03/02/2006, 12h35
  4. fonction booleenne dans une clause where ?
    Par user_h dans le forum Oracle
    Réponses: 1
    Dernier message: 20/10/2005, 15h05

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