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

Langage SQL Discussion :

[LocalDB] Fonctionnement bizarre d'une requête


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2017
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2017
    Messages : 176
    Points : 58
    Points
    58
    Par défaut [LocalDB] Fonctionnement bizarre d'une requête
    Bonjour,

    J'exécute une requête qui ne marche pas tout le temps. Il se peut que quelque chose m'échappe.

    J'ai une seule ligne dans la table salesreturn
    1 100100027 0 0 2403 1 18/06/2017 00:00:00
    et 2 lignes dans la table salesreturnitem
    1 100100027 20 2
    2 100100027 573 5
    La requête ci-dessous me retourne une ligne mais lorsque je remplace 18 par 26 dans le between elle ne retourne plus rien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT sr.SalesReturnId, sr.ReturnDate, sr.InvoiceNo, CONCAT(s.lastname, ', ', s.firstname, ' ', s.MI) as StaffName, 
    sr.TotalAmount, SUM(sri.Quantity) as TotalQuantity
    FROM SalesReturn sr INNER JOIN SalesReturnItem sri ON sr.InvoiceNo = sri.InvoiceNo 
    INNER JOIN Staff s ON s.StaffId = sr.userID 
    WHERE CONVERT(VARCHAR(10),ReturnDate,103)  
    BETWEEN '18/01/1000' AND '19/06/2050' AND sr.InvoiceNo LIKE '%%' 
    GROUP BY sr.SalesReturnId, sr.ReturnDate, sr.InvoiceNo, sr.TotalAmount, s.lastname, s.firstname, s.MI
    ORDER BY ReturnDate, sr.InvoiceNo DESC

    Comment peut on expliquer cela?

    Merci

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,


    Vous convertissez votre date en chaine de caractère avant de faire la comparaison (BETWEEN)

    Ce sont donc les chaines de caractéres (et non les dates) qui sont comparées. Or, la chaine '18/06/1000' n'est pas comprise entre '26/06/1000' et '19/06/2050', puisque '2' est plus grand que '1'...

    quel est le type de la colonne ReturnDate ?

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2017
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2017
    Messages : 176
    Points : 58
    Points
    58
    Par défaut
    [ReturnDate] DATETIME2 (0) DEFAULT ('0000-00-00 00:00:00') NOT NULL,

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    alors faites comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WHERE ReturnDate BETWEEN  '10000118' AND '20500619'

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2017
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2017
    Messages : 176
    Points : 58
    Points
    58
    Par défaut
    Merci pour votre réponse.

    Comment faire pour que je puisse utiliser le format 01/01/2010?

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    Comment faire pour que je puisse utiliser le format 01/01/2010?
    Si c'est du SQL server
    Set Dateformat DMY
    SELECT ...
    WHERE ReturnDate BETWEEN '18/01/1000' AND '19/06/2050'
    Ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT sr.SalesReturnId, sr.ReturnDate, sr.InvoiceNo, 
    	CONCAT(s.lastname, ', ', s.firstname, ' ', s.MI) as StaffName, 
    	sr.TotalAmount, SUM(sri.Quantity) as TotalQuantity
    FROM SalesReturn sr 
    INNER JOIN SalesReturnItem sri 
    	ON sr.InvoiceNo = sri.InvoiceNo 
    INNER JOIN Staff s 
    	ON s.StaffId = sr.userID 
    WHERE ReturnDate BETWEEN CONVERT(datetime2,'18/01/1000',103) AND CONVERT(datetime2,'19/06/2050',103)
    	AND sr.InvoiceNo LIKE '%%' 
    GROUP BY sr.SalesReturnId, sr.ReturnDate, sr.InvoiceNo, sr.TotalAmount, s.lastname, s.firstname, s.MI
    ORDER BY ReturnDate, sr.InvoiceNo DESC
    Mais le format de date proposé par aieeeuuuuu est moins lisible mais il fonctionne tout le temps.
    Cordialement
    Soazig
    Cordialement
    Soazig

  7. #7
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2017
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2017
    Messages : 176
    Points : 58
    Points
    58
    Par défaut
    Merci pour votre réponse.

    J'ai fait la même chose que vous mais j'ai mis datetime au lieu datetime2 ne faut il pas faire la même chose avec ReturnDate ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE CONVERT(datetime2,ReturnDate,103)

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    J'ai fait la même chose que vous mais j'ai mis datetime au lieu datetime2
    Pourquoi ? La requête proposait renvoyait-elle un message d'erreur, ne donnait pas le bon résultat ?
    Personnellement j'ai mis datetime2 car c'est le type de données de ReturnDate et que du coup on compare des datetime2 ensemble, et non des datetimes avec un datetime2.

    Ne faut il pas faire la même chose avec ReturnDate ?
    Même question que précédemment ? message d'erreur ?
    En plus je ne sais pas ce que fait CONVERT(datetime2,ReturnDate,103) car le 103 sert à donner le format d'une date lors d'une conversion chaîne de caractère->date ou date ->chaîne de caractère, il n'a pas de sens pour une conversion datetime2->datetime2.

    Est-ce que la première requête proposée renvoyait un mauvais résultat ?
    Bonne après midi
    Soazig

  9. #9
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2017
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2017
    Messages : 176
    Points : 58
    Points
    58
    Par défaut
    La requête proposait renvoyait-elle un message d'erreur
    Non juste pour dire que j'avais testé la même solution que vous avant de voir votre commentaire et que j'avais mis datetime par manque d'attention au lieu de datetime2.

    Merci ça fonctionne. Je pensais qu'il fallait forcer le formatage au niveau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE CONVERT(datetime2,ReturnDate,103)
    pour que la comparaison se fasse sur deux dates ayant le même format.

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour
    pour que la comparaison se fasse sur deux dates ayant le même format.
    La comparaison de datetime2 n'utilise pas de format, cela compare les dates. Le but de ce que j'ai fait est de comparer des datetime2 sans format.
    Si plus tard tu souhaites comparer des dates converties sous forme de chaine de caractère il faut les formater en AAAAMMJJ sinon ça ne peut pas fonctionner.
    Cordialement
    Soazig

  11. #11
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 761
    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 761
    Points : 52 547
    Points
    52 547
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Jinkas99 Voir le message
    Merci pour votre réponse.

    J'ai fait la même chose que vous mais j'ai mis datetime au lieu datetime2 ne faut il pas faire la même chose avec ReturnDate ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE CONVERT(datetime2,ReturnDate,103)

    NON !!!! Toujours pas ! Une date est une date pas une chaine de caractères.

    Pour le type datetime2, le format ISO (norme internationale du langage SQL) attendu est AAAA-MM-JJ

    Donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE ReturnDate BETWEEN '2018-12-31' AND '2019-01-01'
    Résumé…
    • Pour le type DATETIME créé dans les années 80, le format exigé par la norme SQL est 'AAAAMMJJ hh:mm:ss.nnn' avec une précision plus ou moins grande de la partie horaire (hh:mm minimum).
    • Pour les types DATETIME2, DATE, DATETIMEOFFSET, créé avec la version 2008, le format exigé par la norme SQL est 'AAAA-MM-JJ hh:mm:ss.nnn' avec une précision plus ou moins grande de la partie horaire (hh:mm minimum).

    Pourquoi ce changement ? Tout simplement parce que, entre temps, la norme SQL a évoluée !


    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. Erreur de conversion bizarre dans une requête
    Par SoaB dans le forum Développement
    Réponses: 7
    Dernier message: 03/05/2010, 10h56
  2. Résultat bizarre d'une requête
    Par yesil08 dans le forum Bases de données
    Réponses: 19
    Dernier message: 07/05/2008, 17h18
  3. Réponses: 3
    Dernier message: 10/04/2008, 15h06
  4. [MySQL] Résultat bizarre pour une requête
    Par masseur dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 09/05/2007, 11h46
  5. La fonction CurrentDb() ne fonctionne pas dans une requête
    Par Sébastien Le Goyet dans le forum Access
    Réponses: 8
    Dernier message: 24/11/2005, 17h46

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