2009-09-22 9 views
0

J'ai un problème avec ma requête. Cela me donne le bon résultat pour certains cas et pour d'autres non, donc si quelqu'un pouvait me dire ce qu'il fallait changer, ce serait incroyable parce que je suis coincé avec ça depuis un certain temps maintenant. Voici mes données de table:requête MySQL comparaison DATE

Tableau reservation_logs:

log_id  int(15) auto_increment Primary Unique 
room_log int(10)   
dt_from  date     
dt_until date    

Tableau appartements:

apartman_id  int(10) auto_increment Primary Unique 
apartman_name int(10) 

mon code php pour ce jour:

$date_from = 'text input date'; 
$date_until = 'text input date'; 

$myquery = ("SELECT * FROM reservation_logs WHERE room_log = '$apartman_id' 
AND(((dt_from >= '$date_from' AND dt_from <= '$date_until') 
AND (dt_until >= '$date_until' OR dt_until <= '$date_until')))"); 

maintenant je saisis quelques dates I Should obtenir apartman_id correcte, si elle est occupée ou non. Voici le cas où cela fonctionne: lorsque $date_from correspond au 1er jour du mois et $date_until correspond au dernier jour du mois. Mais par exemple si je choisis les dates $date_from est égale à la 16ème du mois et $date_until est égal à la 17ème du mois, je reçois des résultats incorrects si la pièce est occupée à partir du 15 du mois jusqu'à ce que le 19 nous dise. J'espère que je ne me suis pas trop compliqué, je voulais juste que plus de gens se fassent une idée.

+2

Ce n'est pas directement lié à votre question mais vous avez des vulnérabilités graves dans ce code que vous devriez absolument nettoyer. Assurez-vous de placer toutes les entrées dans votre requête dans mysql_real_escape_string() ou une fonction similaire. – Asaph

+0

Ceci est juste pratique m8, il ne verra jamais le web je vous assure – ant

+0

Gardez à l'esprit que, en interne, les colonnes de date comprennent à la fois la date et l'heure. Si vous vouliez sélectionner toutes les dates du 15 au 16 inclus, vous auriez besoin de dt> = 15 et dt <17ème (ie 16ème à 11: 59.59.999 PM ou plus tôt) –

Répondre

1

Vous voulez donc trouver les réservations entre $ date_from et $ date_until, même si elles ne font que chevaucher cette plage de dates? Quelque chose d'aussi simple que cela devrait suffire ...

SELECT * FROM reservation_logs WHERE room_log = '$apartman_id' 
AND dt_from <= $date_until 
AND dt_until >= $date_from ; 

Il exclut simplement toute réservation qui commence après votre plage de dates, et toute réservation qui se termine avant votre plage de dates. Tout ce qui reste doit être dans la plage de dates ou se chevaucher.

+0

ne fonctionne pas m8, j'ai essayé que un 1er .. – ant

+0

bien c'est un idiome assez standard - suspect c'est le format votre date_until et _date_from variables alors. –

+0

Assurez-vous que ces vars sont au format AAAA-MM-JJ –

0
dt_until >= '$date_until' OR dt_until <= '$date_until' 

sera toujours vraie ...

+0

Y at-il un lien entre ceci et le post ci-dessous, quand j'ai utilisé la combinaison de 2 avec ET rien n'a fonctionné en utilisant OU tous étaient occupés .. – ant

0
dt_from >= '$date_from' AND dt_from <= '$date_until' 

... et cela est vrai que si $date_from = $date_until.