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

PHP & Base de données Discussion :

Recherche sur to_date


Sujet :

PHP & Base de données

  1. #1
    Candidat au Club
    Inscrit en
    Mai 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 9
    Points : 3
    Points
    3
    Par défaut Recherche sur to_date
    Bonjour,

    Je vous explique mon problème : un utilisateur soumet un formulaire en remplissant (entre autre) un champ qui contient une date sous forme jjmmaa. Je voudrais faire une recherche avec cette date et les autres données qu'il aura rempli dans le formulaire. Or j'ai un problème quand il s'agit de faire la recherche sur la date. Je passe le résultat du champ de la date dans la variable $datef.

    Voici ma requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT ID, POS, TICK, DATE_TIME
    FROM PBC
    WHERE POS='$pose'
    AND TICK='$ticket'
    AND DATE_TIME=to_date('".$datef."','DDMMYY');
    J'ai fait le test de cette requête sans la dernière ligne, ou en cherchant avec sysdate au lieu de ma variable $datef, et j'ai eu des résultats : le reste du script (dont un tableau qui se remplit avec ID, POS et TICK) s'affiche, mais pas avec la requête du dessus.

    Je suis sure qu'il existe des infos avec les dates que je teste, et cette requête ne marche pas non plus si je rentre la date "à la main" dans ma requête, exemple : 050609.

    J'ai tenté toutes sortes de syntaxes : '".$_POST["datef"]."', '".$datef."', '.$datef.', $datef sans quotes ni guillemets... Je ne sais plus vraiment quoi utiliser.

    Petite précision, mon champ DATE_TIME est en timestamp, mais je ne pense pas que ça pourrait poser un problème...

    Merci de votre aide.

  2. #2
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    685
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 685
    Points : 658
    Points
    658
    Par défaut
    B'soir,

    Citation Envoyé par Laera Voir le message
    Petite précision, mon champ DATE_TIME est en timestamp, mais je ne pense pas que ça pourrait poser un problème...
    Bien si justement, les 2 formats de date doivent-être les mêmes pour comparaison.
    Je me demande pourquoi tu utilises to_date() en fait.

    Si tu ne veux que la partie date du champ timesatmp, il faut utiliser DATE() dessus.
    Ensuite $datef, doit-être au même format, donc anglais, ou alors tu convertis ton champ timestamp au format français avec date_format.

  3. #3
    Candidat au Club
    Inscrit en
    Mai 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Bonjour Xunil, merci pour ta réponse.

    J'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND DATE(DATE_TIME)=TO_DATE('04-06-09','dd-mm-yy')
    mais j'ai une erreur, 'missing expression'. Et j'ai de nouveau utiliser un to_date, il me semble que c'est la fonction à utiliser...

    Le format des dates qu'il y a déjà dans la base de données est le suivant : 10-MAR-09, pour exemple.

    Ou alors tu convertis ton champ timestamp au format français avec date_format.
    Date_format est pour MySQL uniquement, l'équivalent Oracle est to_char, et je ne vois pas vraiment comme l'utiliser dans ma requête... Je veux dire, je convertis mon champ DATE_TIME au format français, pour ensuite insérer ma valeur $datef dedans ? En sachant que j'utilise bien le format de ma base de données, donc jj-mm-aa...

  4. #4
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    685
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 685
    Points : 658
    Points
    658
    Par défaut
    Désolé, j'étais persuadé que tu travaillais avec mysql..

    Je ne connais pas oracle, mais en regardant la faq de developpez, tu devrais avoir quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND DATE_TIME = TO_CHAR('" . $datedef . "', 'DD-MON-YYYY')
    Je suppose que $datedef est au format yyyy/mm/dd ? Enfin, il faut que ce soit le même format que sysdate.

    Mais bizarre de stocker un tel format de date dans une table.

  5. #5
    Candidat au Club
    Inscrit en
    Mai 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Pas grave, ça arrive ;D

    Bon, alors j'ai changé le format de mon formulaire, à savoir date(d-M-y), donc 08-Jun-09. Un peu avant ma requête, dans mon script php, j'ai fais un $datef=strtoupper($datef); pour être sure que Jun sera un majuscule lors de ma requête : 08-JUN-09, le format "exact" des dates que j'ai dans ma bdd.

    Ensuite,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND DATE_TIME=TO_DATE('" . $datedef . "', 'DD-MON-YY')
    J'ai utilisé to_date car to_char me renvoyais une erreur, du genre "tu peux pas comparer un champ de date à une chaine de caractère", normal...

    Donc maintenant avec cette requête, j'arrive au même résultat qu'avant : rien. Mon script réagit comme si il n'y avait aucun résultat à ma requête, alors que si, j'ai vérifié sur ma base, il y en a.

    Mon problème se situe vraiment sur le format de cette foutue date...

    Un problème avec l'heure peut être ? En tant que timestamp, le champ attend peut être une heure ? Même si les dates que j'ai dans ma BDD ne contiennent pas d'heure ? Dans ce cas, en sachant que l'utilisateur ne soumet que le jour, le mois et l'année, comment pourrais-je insérer l'heure en plus ?

    Je viens de vérifier sur les documents qui m'ont été fournis par mon chef, le type du champ DATE_TIME est un timestamp(2) : précision à deux chiffres pour les secondes...

  6. #6
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    685
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 685
    Points : 658
    Points
    658
    Par défaut
    Comment sont les enregistrements dans ta colonne DATE_TIME en fait ?

    Tu devrais faire une simple requête de test pour voir les différences.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DATE_TIME, TO_DATE('" . $datedef . "', 'DD-MON-YY') FROM ...

  7. #7
    Candidat au Club
    Inscrit en
    Mai 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SQL>  SELECT DATE_TIME, TO_DATE('04-JUN-09', 'DD-MON-YY') FROM PBC_HIST@IWA;
     
    DATE_TIME TO_DATE('
    --------- ---------
    10-MAR-09 04-JUN-09
    11-MAR-09 04-JUN-09
    12-MAR-09 04-JUN-09
    ...
    Sous SQL*Plus. J'ai du mettre la date à la main pour tester ;D

    EDIT : Bon, le format n'a rien à voir avec ça, j'ai testé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SQL> SELECT DATE_TIME, TO_DATE('06-06-2009', 'DD-MM-YYYY') FROM PBC_HIST@IWA;
     
    DATE_TIME TO_DATE('
    --------- ---------
    11-MAR-09 06-JUN-09
    12-MAR-09 06-JUN-09
    13-MAR-09 06-JUN-09
    ...
    Donc voilà... Je ne sais pas comment écrire ma requête, date_time=to_date ne lui convient apparemment pas, to_char n'est pas la solution appropriée, alors je ne sais plus quoi faire :/

  8. #8
    Candidat au Club
    Inscrit en
    Mai 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    C'est re-moi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT ID, POS, TICK, DATE_TIME
    FROM  PBC@IWA 
    WHERE TICK=13 
    AND POS=13 
    AND DATE_TIME BETWEEN to_date('090609','DDMMYY') 
    AND to_date('090609','DDMMYY')+1;
    Bon, ça semble marcher, mais je n'ai pas encore essayé en passant les valeurs de mon formulaire. Je teste ça demain, et posterais en fonction du résultat \o/

    Les joies d'Oracle.

  9. #9
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Bonjour,

    Je suppose que ton champs DATE_TIME est initialisé à un moment donné avec la date courante. Il y a alors très peu de chances que ce soit précisément à minuit... ce qu'il faudrait pour qu'il soit égal à une date donnée convertie en timestamp.

    Je vois donc deux solutions :
    - vérifier si DATE_TIME est compris entre $datef et $datef + 1 jour ;
    - vérifier si la conversion de DATE_TIME en chaîne de caractère est égale à $datef.

    Exemples (non testés) :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT *
    FROM PBC
    WHERE DATE_TIME between to_date('".$datef."','DDMMYY') and to_date('".$datef."','DDMMYY') + 1;
     
    SELECT *
    FROM PBC
    WHERE DATE_TIME >= to_date('".$datef."','DDMMYY')
        AND DATE_TIME < to_date('".$datef."','DDMMYY') + 1;
     
    SELECT *
    FROM PBC
    WHERE to_char(DATE_TIME, 'DDMMYY') = '".$datef."';

    Remarque : Il y a une petite différence entre les résultats possibles pour la première requête et pour les deux autres... si DATE_TIME contient des dates qui tombent par hasard précisément à minuit

  10. #10
    Candidat au Club
    Inscrit en
    Mai 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Bonjour Eusebe, merci pour ta réponse =)

    J'ai donc adapter la requête postée plus tôt au boulot, avec la variable $datef, et les résultats sont niquel. J'ai utilisé la syntaxe suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT ID, POS, TICK, DATE_TIME
    FROM PBC@IWA
    WHERE POS='$pose'
    AND TICK='$ticket'
    AND DATE_TIME BETWEEN to_date('$datef','DD-MM-YYYY') 
    AND to_date('$datef','DD-MM-YYYY')+1
    Donc, pour toi le problème avec cette requête c'est si jamais une date tombe à minuit, je n'aurais pas de résultat ? Bon en pratique c'est certain que ça n'arrivera jamais, ou peut être que si, si jamais un pc a une heure à la con...
    ... En fait je crois que j'ai pas trop bien compris cette histoire de minuit >>

    Bref, j'ai testé ta deuxième syntaxe, elle marche bien, ainsi que la dernière =) (la première c'est la même que celle que j'ai testé ci dessus)

    Donc... Il faudrait que je prenne celle qui est la plus rapide, et qui empecherait le 'bug de minuit' x)

  11. #11
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Citation Envoyé par Laera Voir le message
    Donc, pour toi le problème avec cette requête c'est si jamais une date tombe à minuit, je n'aurais pas de résultat ? Bon en pratique c'est certain que ça n'arrivera jamais, ou peut être que si, si jamais un pc a une heure à la con...
    ... En fait je crois que j'ai pas trop bien compris cette histoire de minuit >>
    En fait la condition 'a BETWEEN x AND y' correspond à 'a >= x AND a <= y'.
    Donc au pire, tu auras des résultats en trop, si a est exactement égal à y (y étant en pratique la date de la recherche + 1 jour).

    Exemples :
    10/03/09 00:00:00
    10/03/09 11:03:48
    10/03/09 18:15:35
    11/03/09 00:00:00
    11/03/09 06:48:55

    Pour une recherche des données du 10/03, l'utilisation de between ramènera les 4 premiers enregistrements et pas les 3 premiers.

Discussions similaires

  1. Recherche sur tous les fichiers d'un projet
    Par Kaorichan dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 28/04/2005, 11h28
  2. Recherche sur mots de 3 lettres
    Par mamizo dans le forum Bases de données
    Réponses: 7
    Dernier message: 16/02/2005, 14h59
  3. Réponses: 2
    Dernier message: 30/11/2004, 09h42
  4. Réponses: 8
    Dernier message: 10/09/2004, 17h30
  5. Recherche sur champ calculé
    Par srvremi dans le forum Bases de données
    Réponses: 5
    Dernier message: 06/07/2004, 14h04

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