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 :

DATEDIFF dans clause WHERE


Sujet :

MS SQL Server

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    386
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 386
    Points : 220
    Points
    220
    Par défaut DATEDIFF dans clause WHERE
    Bonjour à tous,

    Je sollicite votre aide car impossible de trouver la solution, voici mon problème.

    J'ai besoin de mettre un DATEDIFF dans une clause WHERE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    WHERE
    DATEDIFF(day,MaReponse,GETDATE())<100
    et je me retrouve avec l'erreur : Échec de la conversion de la date et/ou de l'heure à partir d'une chaîne de caractères.

    Dans MaReponse la date est du genre : 20150105 , varchar(8)

    Merci d'avance pour votre aide.

    @+

  2. #2
    Invité
    Invité(e)
    Par défaut
    Mauvaise modélisation... Mettre des dates dans des varchar, erreur de débutant !
    Et forcément DATEDIFF compare des pommes avec des pommes et non des poires et de pommes...
    Si c'est possible, modifier votre type de données.

    Une solution de contournement serait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    declare @MaReponse varchar(8) = '20150105'
    select DATEDIFF(day, cast(@MaReponse as datetime), GETDATE())

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    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 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    C'est normal... Un VARCHAR c'est du littéral et pas des date.
    Commencez par revoir votre modèle en mettant du type DATE à la place de cet immonde varchar....

    On ne vous à pas appris à l'école qu'on ne mélangeait pas les choux et les carottes dans les calculs ?

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

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    386
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 386
    Points : 220
    Points
    220
    Par défaut
    Je reprends un existant et je ne peux pas modifier le modèle. Petite erreur, c'est colonne reçoit divers types de réponses, sa taille est en réalité un varchar(50) et je ne peux pas la transformer en DATE.

    Dois-je comprendre que je suis dans la m..de ?

    ne fonctionne pas !

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Thomad Voir le message
    Je reprends un existant et je ne peux pas modifier le modèle. Petite erreur, c'est colonne reçoit divers types de réponses, sa taille est en réalité un varchar(50) et je ne peux pas la transformer en DATE.
    Un beau modèle de merde...
    Bon, comme j'ai aussi fait les joies de ce genre d'héritage empoisonné, tu peux bricoler avec la fonction ISDATE ( https://msdn.microsoft.com/en-us/library/ms187347.aspx )
    J'aurais tendance à faire une colonne calculée qui convertirait les données pourries en format DATE quand c'est possible.
    Mais il faut garder à l'esprit que ça n'empêchera pas d'avoir des données convertibles en DATE alors que ça n'en ai pas vraiment une, comme un chiffre anodin genre 2015 ou 1999...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    declare @MaReponse varchar(50) = '20150105'
    select DATEDIFF(day, case when ISDATE(@MaReponse) = 1 then cast ( @MaReponse as DATE ) else NULL END, GETDATE())
     
    SET @MaReponse = '2015'
    select DATEDIFF(day, case when ISDATE(@MaReponse) = 1 then cast ( @MaReponse as DATE ) else NULL END, GETDATE())
    Dernière modification par Invité ; 11/03/2015 à 18h38.

  6. #6
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Toutes vos lignes sont-elles convertibles en DATE?
    A propos quelle est votre version de SQL SERVER?
    Si >=2008 faites un index filtré sur les lignes convertible en date, le cast devrait alors fonctionner car ne prendra pas en compte les lignes non convertibles...
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

Discussions similaires

  1. [t-sql] instruction CASE dans clause WHERE
    Par ignitionflip dans le forum Langage SQL
    Réponses: 4
    Dernier message: 22/01/2007, 18h07
  2. Réponses: 8
    Dernier message: 16/11/2006, 13h31
  3. Select dans clause Where
    Par Bisûnûrs dans le forum Requêtes
    Réponses: 2
    Dernier message: 11/08/2006, 11h50
  4. [PL/SQL Oracle] Syntaxe dans clause where
    Par Misdrhaal dans le forum Oracle
    Réponses: 2
    Dernier message: 01/03/2006, 13h33
  5. INNER JOIN ... ON ... ou jointure dans clause where
    Par schmur1 dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 28/06/2005, 09h16

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