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

Bases de données Delphi Discussion :

[Firebird] Requête BETWEEN


Sujet :

Bases de données Delphi

  1. #1
    Membre éclairé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    1 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Points : 681
    Points
    681
    Par défaut [Firebird] Requête BETWEEN
    Bonsoir à tous,

    La requête suivante s’exécute sans problème mais sans qu'elle ne me renvoie des enregistrements pourtant bien existants.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Qry.SQL.Clear;
    Qry.SQL.Text:='SELECT * FROM VW_STOCK_CONTROL_ENTREE WHERE (DATE_ENTREE BETWEEN :FROM_DATE AND :TO_DATE)';
    Qry.Params.ByNameAsDateTime['FROM_DATE']:= edFrom.Date;
    Qry.Params.ByNameAsDateTime['TO_DATE']:= edTO.Date;
    Qry.Open
    Je soupçonne qu'il faut donner le bon format de date pour Firebird mais ne sais quel est le bon. Les champs du between sont de type date.
    J'utilise Firebird et UIB. Ou bien y-a-t-il S.V.P. une autre façon de construire cette requête ? En vous remerciant de votre aide.
    Si quelqu'un t'a offensé, ne cherche pas à te venger; assieds-toi au bord de la rivière et, bientôt, tu verras passer son cadavre.

    Lao Tseu - un sage chinois

    Celui qui lutte contre les monstres doit veiller à ne pas le devenir lui-même.
    Et quand ton regard pénètre longtemps au fond d'un abîme, l'abîme, lui aussi, pénètre en toi.

    Friedrich Nietzsche - Par délà le bien et le mal

  2. #2
    Membre éclairé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    1 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Points : 681
    Points
    681
    Par défaut
    Le problème est résolu . C'etait une affaire de format de date :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Qry.SQL.Clear;
    Qry.SQL.Text:='SELECT * FROM VW_STOCK_CONTROL_ENTREE WHERE (DATE_ENTREE BETWEEN '+QuotedStr(FormatDateTime('mm/dd/yyyy',edFrom.Date))+' AND '+QuotedStr(FormatDateTime('mm/dd/yyyy',edTO.Date))+')' ;
    Qry.Params.ByNameAsDateTime['FROM_DATE']:= edFrom.Date;
    Qry.Params.ByNameAsDateTime['TO_DATE']:= edTO.Date;
    Qry.Open
    Si quelqu'un t'a offensé, ne cherche pas à te venger; assieds-toi au bord de la rivière et, bientôt, tu verras passer son cadavre.

    Lao Tseu - un sage chinois

    Celui qui lutte contre les monstres doit veiller à ne pas le devenir lui-même.
    Et quand ton regard pénètre longtemps au fond d'un abîme, l'abîme, lui aussi, pénètre en toi.

    Friedrich Nietzsche - Par délà le bien et le mal

  3. #3
    Membre confirmé
    Avatar de alheuredudejeuner
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2005
    Messages : 376
    Points : 632
    Points
    632
    Billets dans le blog
    4
    Par défaut bonjour
    sauf que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Qry.Params.ByNameAsDateTime['FROM_DATE']:= edFrom.Date;
    Qry.Params.ByNameAsDateTime['TO_DATE']:= edTO.Date;
    Ne sert plus à rien, et tu risques une injection sql.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Qry.Params.ByNameAsDateTime['FROM_DATE']:= Trunc(edFrom.Date);
    Qry.Params.ByNameAsDateTime['TO_DATE']:=Trunc(edTO.Date);
    sur ta première solution aurait été mieux

    cordialement

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par freud Voir le message
    Je soupçonne qu'il faut donner le bon format de date pour Firebird mais ne sais quel est le bon. Les champs du between sont de type date
    j'utilise Firebird et UIB. Ou bien y-a-t-il S.V.P. une autre façon de construire cette requête.
    Pour le soupçon, ce n'est pas Firebird le coupable, plutôt peut-être UIB qui transformerait mal la date avec son Param.ByNameAsDateTime['FROM_DATE'] mais j'ai quand même un doute.
    j'utilise régulièrement les BETWEEN entre deux dates avec Firebird et des requêtes paramétrées et n'ai jamais eu ce problème, évidemment cela fait un moment que je n'ai plus utilisé UIB !
    une remarque cependant, si la colonne est de type date pourquoi utilisé un ByNameAsDateTime alors que à ma connaissance il existe un ByNameAsDate ?
    (retrouvé dans uibcodegen.pas ligne 77 et +)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Membre éclairé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    1 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Points : 681
    Points
    681
    Par défaut
    Bonjour tout le monde,

    Citation Envoyé par alheuredudejeuner
    Ne sert plus à rien, et tu risques une injection sql.
    Non je n'ai pas utiliser les paramétres j'ai juste fait un copier/coller depuis mon 1ere post en insérant les formats dates en oubliant de supprimer le reste

    Citation Envoyé par SergioMaster
    une remarque cependant, si la colonne est de type date pourquoi utilisé un ByNameAsDateTime alors que à ma connaissance il existe un ByNameAsDate ?
    Parce que ca me donne ceci à la compilation avec le ByNameAsDate :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    [Error] UControlStock.pas(250): Incompatible types: 'Integer' and 'TDateTime'
    [Error] UControlStock.pas(251): Incompatible types: 'Integer' and 'TDateTime'
    Merci à vous
    Si quelqu'un t'a offensé, ne cherche pas à te venger; assieds-toi au bord de la rivière et, bientôt, tu verras passer son cadavre.

    Lao Tseu - un sage chinois

    Celui qui lutte contre les monstres doit veiller à ne pas le devenir lui-même.
    Et quand ton regard pénètre longtemps au fond d'un abîme, l'abîme, lui aussi, pénètre en toi.

    Friedrich Nietzsche - Par délà le bien et le mal

  6. #6
    Membre éclairé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    1 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Points : 681
    Points
    681
    Par défaut
    Pardon alheuredudejeuner, j'avais mal compris j'ai pas vu le Trunc de date en effet c'est bon pour la 1ere solution qui règle le problème et en plus avec le ByNameAsDate

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Qry.SQL.Clear;
    Qry.SQL.Text:='SELECT * FROM VW_STOCK_CONTROL_ENTREE WHERE (DATE_ENTREE BETWEEN :FROM_DATE AND :TO_DATE)';
    Qry.Params.ByNameAsDate['FROM_DATE']:= Trunc(edFrom.Date);
    Qry.Params.ByNameAsDate['TO_DATE']:=Trunc(edTO.Date);
    Qry.Open
    Merci alheuredudejeuner
    Si quelqu'un t'a offensé, ne cherche pas à te venger; assieds-toi au bord de la rivière et, bientôt, tu verras passer son cadavre.

    Lao Tseu - un sage chinois

    Celui qui lutte contre les monstres doit veiller à ne pas le devenir lui-même.
    Et quand ton regard pénètre longtemps au fond d'un abîme, l'abîme, lui aussi, pénètre en toi.

    Friedrich Nietzsche - Par délà le bien et le mal

  7. #7
    Membre éclairé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    1 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Points : 681
    Points
    681
    Par défaut
    Bonjour,

    Je reviens à ce topic pour une petite question si vous permettez.
    Y a t-il une différence importante en vitesse d’exécution entre ces deux requêtes sachant que c'est un SELECT depuis une vue créee dans une BDD ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Qry.SQL.Text:='SELECT * FROM VW_STOCK_CONTROL_ENTREE WHERE (DATE_ENTREE BETWEEN :FROM_DATE AND :TO_DATE)';
    Qry.Params.ByNameAsDateTime['FROM_DATE']:= Trunc(edFrom.Date);
    Qry.Params.ByNameAsDateTime['TO_DATE']:=Trunc(edTO.Date);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Qry.SQL.Text:='SELECT * FROM VW_STOCK_CONTROL_ENTREE WHERE (DATE_ENTREE BETWEEN '+QuotedStr(FormatDateTime('mm/dd/yyyy',edFrom.Date))+' AND '+QuotedStr(FormatDateTime('mm/dd/yyyy',edTO.Date))+')' ;
    En vous remerciant.
    Si quelqu'un t'a offensé, ne cherche pas à te venger; assieds-toi au bord de la rivière et, bientôt, tu verras passer son cadavre.

    Lao Tseu - un sage chinois

    Celui qui lutte contre les monstres doit veiller à ne pas le devenir lui-même.
    Et quand ton regard pénètre longtemps au fond d'un abîme, l'abîme, lui aussi, pénètre en toi.

    Friedrich Nietzsche - Par délà le bien et le mal

  8. #8
    Membre confirmé
    Avatar de alheuredudejeuner
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2005
    Messages : 376
    Points : 632
    Points
    632
    Billets dans le blog
    4
    Par défaut pour tester
    bonjour

    pour mesurer le temps sur des temps très cours,
    j'exécute 1000, 10000 ou plus de fois le nombre de requêtes.
    Je relève le temps alors mesurable et je compare.

    Je reproduit plusieurs fois les mesures et je fais une moyenne quand la base est encours d'exécution, les résultats peuvent être faussé par une grosse requête sur la base ou un OS ralenti pour tout autre chose.

    Cordialement.

  9. #9
    Membre éclairé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    1 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Points : 681
    Points
    681
    Par défaut
    Non dans mon cas il ne s'agit pas de tester de grosses ou de petites requetes juste savoir la différence de l'utilisation des paramètres :FROM_DATE et QuotedStr(FormatDateTime('mm/dd/yyyy',edFrom.Date)) dans la requête. Je veux dire si cette différence d'ecriture des paramètres affecte le plan d'execution des requetes sur le serveur. Merci.
    Si quelqu'un t'a offensé, ne cherche pas à te venger; assieds-toi au bord de la rivière et, bientôt, tu verras passer son cadavre.

    Lao Tseu - un sage chinois

    Celui qui lutte contre les monstres doit veiller à ne pas le devenir lui-même.
    Et quand ton regard pénètre longtemps au fond d'un abîme, l'abîme, lui aussi, pénètre en toi.

    Friedrich Nietzsche - Par délà le bien et le mal

  10. #10
    Membre confirmé
    Avatar de alheuredudejeuner
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2005
    Messages : 376
    Points : 632
    Points
    632
    Billets dans le blog
    4
    Par défaut Il n'y pas pas de différence au niveau du résultat
    Bonjour,

    Pour la sécurité, il faut mieux faire des requêtes avec paramètres ( je radote ), même si faire de l'injection SQL dans un between ne me vient pas à l'esprit.

    Pour le temps d'exécution, je ne sais pas, et quand je ne sais pas je teste. ( Ca évite les préjugés ).

    Cordialement

    André

  11. #11
    Membre éclairé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    1 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Points : 681
    Points
    681
    Par défaut
    Merci alheuredudejeuner,
    Je modifie le post pour précisez que je dois recourir à cette méthode de l'injection et pas dans toutes les situations sauf dans cette requete paramétrer qui ne marche pas pour moi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    V1:='SELECT FIRST :NBROW * FROM VW_LIVRAISION_FOURNISSEUR WHERE (LIVRAISON_ID>= :NextRow AND LIVRAISON_ID<=:NextRow';
    Qry.SQL.Text:=V1;
    Qry.Params.ByNameAsInteger['NBROW']:=NbRow;
    Qry.Params.ByNameAsInteger['NEXTROW']:=NextRow;
    Qry.Params.ByNameAsInteger['ENDROW']:=EndRow;
    Au début ca marche mais lorsque je demande l'enregistrement suivant ca ne marche pas. Par contre, avec l'injection avec le code suivant ca marche.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    V1:='SELECT FIRST '+IntToStr(NBROW)+' * FROM VW_LIVRAISION_FOURNISSEUR WHERE (LIVRAISON_ID>='+IntToStr(NextRow)+ ' AND LIVRAISON_ID<='+IntToStr(EndRow)+')';
    Qry.SQL.Text:=V1;
    C'est une chaine SQL que je constuit suivant des critères de recherches et à la fin je rajoute le tri ASC/DESC selon le choix.
    Si quelqu'un t'a offensé, ne cherche pas à te venger; assieds-toi au bord de la rivière et, bientôt, tu verras passer son cadavre.

    Lao Tseu - un sage chinois

    Celui qui lutte contre les monstres doit veiller à ne pas le devenir lui-même.
    Et quand ton regard pénètre longtemps au fond d'un abîme, l'abîme, lui aussi, pénètre en toi.

    Friedrich Nietzsche - Par délà le bien et le mal

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

Discussions similaires

  1. requete between restriction qui ne marche pas
    Par xouzi dans le forum Requêtes
    Réponses: 5
    Dernier message: 02/10/2012, 09h28
  2. requete between sur dates
    Par cedlannoy dans le forum Débuter
    Réponses: 5
    Dernier message: 18/02/2008, 12h34
  3. Pb requete between!
    Par Anounou dans le forum Requêtes
    Réponses: 7
    Dernier message: 12/06/2007, 10h50
  4. [Firebird] requete goupee
    Par ftoutin dans le forum Langage SQL
    Réponses: 1
    Dernier message: 19/01/2007, 17h11
  5. [FireBird] Requête portant sur une saison parmi plusieurs
    Par Lucien dans le forum Langage SQL
    Réponses: 7
    Dernier message: 30/08/2006, 10h22

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