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

Requêtes MySQL Discussion :

Comment écrire une requete qui fonctionne à coup sûr avec une date ?


Sujet :

Requêtes MySQL

  1. #1
    Membre habitué

    Inscrit en
    Février 2005
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 356
    Points : 175
    Points
    175
    Par défaut Comment écrire une requete qui fonctionne à coup sûr avec une date ?
    Bonjour tout le monde !

    J'ai un problème concernant les dates sur une BDD MySQL.

    Je m'explique : Je développe un programme en Delphi (avec le composant ADO pour le lien à la BDD).

    J'aimerais savoir comment est stocké la date-heure dans une bdd mysql.
    Moi j'enregistre sous la forme "jour/mois/annee 10:45:00"

    Lorsque je fais un select avec Toad, il me retourne la date dans le même format.

    Comme ma requête sous Delphi me ramène aucune ligne (lorsque dans ma clause Where je met une date), je me demande si il n'y a pas un petit quelque chose à faire pour forcer le format ou autre.

    Voici ma requete à l'origine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT CodePersonnel
      FROM PLANNING
     WHERE DateHeure = :LaDateHeure
    Voici ma requete en spécifiant le format :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT CodePersonnel
      FROM PLANNING
     WHERE DATE_FORMAT(DateHeure, '%d/%m/%Y %H:%i:%s') = DATE_FORMAT(:LaDateHeure, '%d/%m/%Y %H:%i:%s')
    La date passé "LaDateHeure" est = "08/04/2009 10:45:00"

    Avec la 2ème requete, est-ce que je met toute les chances de mon côté pour ne pas avoir de problème ? Avez-vous quelques chose à me conseiller ?

    PS : Je vais aller sur la section Delphi pour mon composant ADO, qui je pense est buggé :/

  2. #2
    Membre habitué

    Inscrit en
    Février 2005
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 356
    Points : 175
    Points
    175
    Par défaut
    J'ai encore bidouller quelque chose et ça à l'air de fonctionner.

    Voici mon code (Exemple 1) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    var
      DateTmp1: TDateTime;
      queSup: TAdoQuery;
    begin
      DateTmp1:= StrToDateTime('08/04/2009 10:45:00');
      queSup:= CreeQuery;
      try
        with queSup do
        begin
          Close;
          SQL.Clear;
          SQL.Add('SELECT DateHeure FROM PLANNINGS');
          SQL.Add(' WHERE cast(DateHeure as char) = cast(:LaDateHeure as char)');
          Parameters.ParamByName('LaDateHeure').DataType:= ftString;
          Parameters.ParamByName('LaDateHeure').Value:= FormatDateTime('yyyy-mm-dd hh:mm:ss', DateTmp1);
          Open;
          if not EOF then
                showmessage('not eof')
          else showmessage('eof');
        end;
      finally
        FreeAndNil(queSup);
      end;
    Voici mon code (Exemple 2) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    var
      DateTmp1,
      DateTmp2: TDateTime;
      queSup: TAdoQuery;
    begin
      DateTmp1:= StrToDateTime('08/04/2009 10:45:00');
      DateTmp2:= StrToDateTime('08/04/2009 11:00:00');
      queSup:= CreeQuery;
      try
        with queSup do
        begin
          Close;
          SQL.Clear;
          SQL.Add('SELECT DateHeure FROM PLANNINGS');
          SQL.Add(' WHERE cast(DateHeure as char) between cast(:LaDateDebut as char) and cast(:LaDateFin as char)');
          Parameters.ParamByName('LaDateDebut').DataType:= ftString;
          Parameters.ParamByName('LaDateDebut').Value:= FormatDateTime('yyyy-mm-dd hh:mm:ss', DateTmp1);
          Parameters.ParamByName('LaDateFin').DataType:= ftString;
          Parameters.ParamByName('LaDateFin').Value:= FormatDateTime('yyyy-mm-dd hh:mm:ss', DateTmp2);
          Open;
          while not EOF do
          begin
            showmessage(FieldByName('DateHeure').AsString);
            Next;
          end;
          showmessage('eof');
        end;
      finally
        FreeAndNil(queSup);
      end;
    => Ici, la requete me retourne bien 2 lignes. Une ligne à '08/04/2009 10:45:00' et une autre à '08/04/2009 11:00:00' (donnée enregistré en base)
    ==> J'en conclue que le Between fonctionne correctement même si je cast en chaine (Ce que je n'étais pas sûr)

    C'est tout de même étrange ce bidoullage. Avez-vous une explication ou une meilleure solution ?

  3. #3
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 006
    Points : 23 668
    Points
    23 668
    Par défaut
    Bonjour,

    Les réponses à la plupart de tes questions sont dans la FAQ MySQL, qu'il faut consulter avant de poster...
    Concernant la comparaison, en convertissant les dates en chaînes de caractères, la comparaison va fonctionner tant que les dates sont dans la même journée. Mais si tu compares 2 dates pour lesquelles il y a un changement de mois, là ça ne va plus marcher. En effet, en chaîne de caractères, le "01/12/2008" précède le "31/01/1999" puisque 0 précède 3...

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  4. #4
    Membre habitué

    Inscrit en
    Février 2005
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 356
    Points : 175
    Points
    175
    Par défaut
    A mon avis, ta pas très bien regardé le code

    Je converti la date en chaine sous la forme yyyy-mm-dd hh:mm:ss

    Plus de problème comme ça.

  5. #5
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 006
    Points : 23 668
    Points
    23 668
    Par défaut
    Oooops, exact... Ca m'apprendra à répondre à des heures où on n'a plus les yeux en face des trous .

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  6. #6
    Membre habitué

    Inscrit en
    Février 2005
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 356
    Points : 175
    Points
    175
    Par défaut
    La nuit porte conseil et je pense que je vais resté sur une nouvelle solution qui est celle dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SQL.Add('SELECT DateHeure');
    SQL.Add('  FROM PLANNINGS');
    SQL.Add(' WHERE DateHeure = :LaDateDebut');
    Parameters.ParamByName('LaDateDebut').Value:= FormatDateTime('yyyy-mm-dd hh:mm:ss', DateTmp1);
    Je spécifie le format de la date dans mon code Delphi.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 09/07/2008, 18h04
  2. Réponses: 1
    Dernier message: 03/08/2007, 11h09
  3. appel d'une procédure qui renvoie le résultat d'une requete
    Par audreyc dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 16/03/2006, 15h02
  4. Réponses: 8
    Dernier message: 11/08/2005, 10h32
  5. une requete qui fonctionne aux 3/4...
    Par allowen dans le forum Langage SQL
    Réponses: 3
    Dernier message: 27/01/2005, 23h08

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