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 :

Aide à la construction de ma requête


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    SOLIMUT
    Inscrit en
    Mai 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : SOLIMUT
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2012
    Messages : 2
    Par défaut Aide à la construction de ma requête
    Bonjour à tous,

    Je suis venu à l'aide car j'ai jamais eu ce type de problème avec une requête SQL.

    L'exemple est très parlant :

    Si j'exécute cette requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select datediff(second,date_alarme,date_deb_inter) from interventions
    where 
    datediff(second,date_alarme,date_deb_inter) <= 3600
    and 
    num_inter in ('6870556')
    Le résultat est : 1261 (rien d'anormal)

    Si j'exécute celle ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select datediff(second,date_alarme,date_deb_inter) from interventions
    where 
    datediff(second,date_alarme,date_deb_inter) <= 3600
    and  num_inter in ('6809234')
    Le résultat est :1655 (rien d'anormal)

    Par contre si j'exécute celle ci (réunification des deux):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select datediff(second,date_alarme,date_deb_inter) from interventions
    where 
    datediff(second,date_alarme,date_deb_inter) <= 3600
    and 
    num_inter in ('6870556','6809234')
    Voici la réponse de SQL.
    Msg 535, Level 16, State 0, Line 1
    Difference of two datetime columns caused overflow at runtime.
    Vous me direz pourquoi ne pas faire à la minute (parce que ça fonctionne si si), le problème est que SQL sur des différences de dates à la minute fait des arrondis et ça m'arrange pas.

    J'espère que vous pourrez m'aider

    Merci à vous par avance.

  2. #2
    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 : 44
    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,

    Erreur intéressante et je comprend votre surprise, même si cela me paraît bizarre que vous ne l'obteniez pas lorsque les requêtes n'ont pour cible qu'une seule valeur de num_inter.

    En fait, il faut (comme souvent) s'en référer à la documentation :

    Si la valeur retournée est hors limites pour int (-2 147 483 648 à +2 147 483 647), une erreur est retournée. Pour millisecond, la différence maximale entre startdate et enddate est de 24 jours, 20 heures, 31 minutes et 23.647 secondes. Pour second, la différence maximale est de 68 ans.
    Je suis donc curieux de savoir quelle valeurs se trouvent dans les colonnes date_alarme et date_deb_inter.

    On peut peut-être calculer la différence en secondes puis multiplier le résultat par 1000, mais comme vous le dites, il est possible que vous perdiez en précision.

    En outre, le prédicat WHERE datediff(second,date_alarme,date_deb_inter) <= 3600 n'est pas cherchable.
    Si c'est une requête qui est exécutée très souvent, vous aurez tout intérêt à créer une colonne calculée (attention donc au problème rencontré) et à l'indexer, pour que la requête puisse ne profiter.

    @++

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bizarre que ça ne fasse qu'avec les deux valeurs.
    Allez jeter un œil par là :
    http://social.msdn.microsoft.com/for...-5732f28eb1ac/

  4. #4
    Nouveau candidat au Club
    Homme Profil pro
    SOLIMUT
    Inscrit en
    Mai 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : SOLIMUT
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2012
    Messages : 2
    Par défaut
    Bonjour,

    Merci pour vos retour, concernant les valeurs hors limite j'avais déjà rencontré le souci mais sur des dates en 1800 comparées à des dates en 2011.

    Par contre je suis allé jeté un coup d'oeil sur le lien, ils rappellent la limite eux aussi mais ils font des conversions de la date diff je me suis donc lancé mais j'ai à nouveau un résultat bizarre.

    Mon but est de mettre un filtre sur la date diff pour ressortir à la seconde prêt que mes interventions en dessous ou égal à 3600 donc voici la requête :

    SELECT ABS(CONVERT(BIGINT,datediff(second,date_alarme,date_deb_inter))),date_alarme,date_deb_inter FROM interventions
    WHERE
    ABS(CONVERT(BIGINT,datediff(second,date_alarme,date_deb_inter))) <= 3600
    AND
    num_inter IN ('6646536','6899660','6635036')

    J'ai bien entendu le même message d'erreur :

    Msg 535, Level 16, State 0, Line 1
    Difference of two datetime columns caused overflow at runtime.

    Par contre si j'enlève le filtre sur la date diff tout en laissant l'affichage de la date diff dans le select pour voir ce qui cloche:

    SELECT ABS(CONVERT(BIGINT,datediff(second,date_alarme,date_deb_inter))),date_alarme,date_deb_inter FROM interventions
    WHERE
    num_inter IN ('6646536','6899660','6635036')

    Magie j'ai le droit à un résultat (du coup ça répondra à la question quelles sont les valeurs de mes champs) :

    (No column name) date_alarme date_deb_inter
    767 2012-04-01 23:54:13.000 2012-04-02 00:07:00.000
    3287 2012-04-28 23:58:13.000 2012-04-29 00:53:00.000
    2441 2012-03-31 23:24:19.000 2012-04-01 00:05:00.000


    Par contre elsuket je n'ai pas compris cette phrase :

    En outre, le prédicat WHERE datediff(second,date_alarme,date_deb_inter) <= 3600 n'est pas cherchable.

    la datediff renvoi un resultat pourquoi ne pourrait on pas appliquer un filtre dessus ?

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    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 : 22 010
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par Gregouze1986 Voir le message
    Par contre elsuket je n'ai pas compris cette phrase :

    En outre, le prédicat WHERE datediff(second,date_alarme,date_deb_inter) <= 3600 n'est pas cherchable.

    la datediff renvoi un resultat pourquoi ne pourrait on pas appliquer un filtre dessus ?

    A lire sur le sujet : http://blog.developpez.com/sqlpro/p1...ql-sargable-c/

    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. [AC-2010] Aide pour la construction d'une requête ?
    Par [ZiP] dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 07/03/2014, 00h15
  2. [10gR2] Aide pour construction requête avec MAX
    Par teen6517 dans le forum SQL
    Réponses: 6
    Dernier message: 06/08/2013, 11h51
  3. Besoin d'aide construction d'une requête
    Par frankiboy dans le forum Requêtes et SQL.
    Réponses: 0
    Dernier message: 10/03/2008, 19h25
  4. [MySQL] Aide à la création d'une requête
    Par tom06440 dans le forum Requêtes
    Réponses: 6
    Dernier message: 19/10/2005, 22h05
  5. Problème pour la construction d'un requête
    Par TshAw dans le forum Langage SQL
    Réponses: 4
    Dernier message: 10/02/2005, 17h35

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