Problème avec recherche de date

shadowmen121 Messages postés 124 Date d'inscription   Statut Membre Dernière intervention   -  
shadowmen121 Messages postés 124 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

après quelques recherches infructueuses pour la résolution de mon problème sur google, je fais appel à vous. Je vous explique, j'ai un problème avec une requête mySQL au format PHP.

Ce que je veux faire:
- Faire une recherche entre deux dates (entré par l'utilisateur) De: Date de départ A: Date de fin

Le code actuel:
$datedebut =$_POST['datedebut'];
$datefin =$_POST['datefin'];

if ($datedebut != '' && $datefin != ''){
$datedebut_prog =date("d/m/Y", (strtotime($datedebut)-3600*24));
$datefin_prog =date("d/m/Y", (strtotime($datefin)+3600*24));

if ($typedecas == 'ouvert'){
$query = " SELECT *
FROM lesClients
WHERE process NOT LIKE 'Complete' AND process NOT LIKE 'Non valide'
AND dateouverture>=\"$datedebut_prog\"
AND dateouverture<=\"$datefin_prog\"";
}
else{
$query = " SELECT *
FROM lesClients
WHERE process LIKE 'Complete'
OR process LIKE 'Non valide'
AND dateouverture>=\"$datedebut_prog\"
AND dateouverture<=\"$datefin_prog\"";
}
}
else{
print "Erreur de recherche, date invalide!";
$erreur=true;
}

Si l'utilisateur entre une date de départ (ex: 20/12/2010) et une date de fin (ex: 20/12/2010) je veux que avoir, comme valeur de retour, tout les cas (sous ouvert OU fermé) de cette journée.

Est-ce quelqu'un vois une erreur dans le code ?

Merci,


4 réponses

swed
 
Bonjour,

Tout d'abord il faut savoir quel est le format du champ 'dateouverture' en base.
Est-ce un format chaine ou date ???

Si c'est un format DATE, alors dans ta requête SQL, tu compares une date avec une chaine, et donc il serait bon d'ajouter un to_char sur la date, ou to_date sur la chaîne.
Ca pourrait éventuellement fonctionner en fonction de la définition du format date de ton SGBD ; mais il faut mieux toujours comparer des dates avec des dates.

Je m'étonne de voir WHERE process LIKE 'Complete' OR process LIKE 'Non valide';
Je te conseille de remplacer cet expression par :
WHERE process IN ( 'Complete', 'Non valide' )

Ce sera plus performant que le LIKE, qui est fait pour évaluer une expression, et pas une définition exacte (même si, je suis d'accord, ca fonctionne).

Cordialement, M.
0
shadowmen121 Messages postés 124 Date d'inscription   Statut Membre Dernière intervention   27
 
Bonjour Swed,

merci pour ta réponse. En fait, actuellement, le champ 'dateouverture' est au format DATETIME.

Initiailement, je voulais simplement comparer les dates. Par contre, de mémoire, si j'entrais la même journée comme date de début et de fin, la requête ne me retournait rien. (En supposant que j'aurais du obtenir une réponse) D'où mon petit tour de passe-passe avec:

$datedebut_prog =date("d/m/Y", (strtotime($datedebut)-3600*24));
$datefin_prog =date("d/m/Y", (strtotime($datefin)+3600*24));

Des suggestions pour résoudre mon problème ?
0
swed
 
Bonjour,

D'après moi, il faudrait laisser les dates datedebut_prog et datefin_prog au format saisi par l'utilisateur (ils contiennent une chaine de format DD/MM/YYYY).

Et de transformer ta requête SQL ainsi, pour qu'elle convertisse ces chaines en dates, et compare une date avec une date :
SELECT *
FROM lesClients
WHERE process IN ('Complete', 'Non valide')
AND dateouverture>=TO_DATE('$datedebut_prog', 'DD/MM/YYYY')
AND dateouverture<=TO_DATE('$datefin_prog', 'DD/MM/YYYY');

Attention, pas de guillemets (") dans les requêtes SQL, uniquement des quotes simples (').

Ca devrait fonctionner...

Cordialement, M.
0
shadowmen121 Messages postés 124 Date d'inscription   Statut Membre Dernière intervention   27
 
Bonjour Swed,

j'obtiens le message:

Impossible de completer la requete SELECT * FROM lesClients WHERE process IN ('Complete', 'Non valide') AND dateouverture>=TO_DATE('31/12/2000', 'DD/MM/YYYY') AND dateouverture<=TO_DATE('02/01/2001', 'DD/MM/YYYY') :FUNCTION dast.TO_DATE does not exist

Je me doute que la fonction TO_DATE n'existe pas... une recherche rapide sur google semble tendre vers STR_TO_DATE... Par contre, mes champs $datedebut_prog et $datefin_prog sont déjà sous cette forme (a mon avis).

L'entré initiale était 01/01/2001 (idem pour date de début et fin) alors, les champs $datedebut_prog et $datefin_prog sont respectivement:

31/12/2000 et 02/01/2001

(ce qui correspond à ma date initiale -1 jour et la date finale + 1 jour) Autrement, je pourrais virer ca si j'obtiens une façon de comparer deux dates sans rajouter ou enlever des jours...
0