2010-01-05 6 views
2

J'ai besoin d'une requête pour sélectionner des données entre deux dates avec la date du jour comme référence.Requête de plage de dates MySQL

La base de données possède un champ date-heure pour "démarrer" et un champ date-heure pour "fin".

$todays_date = date("Y-m-d H:i:s"); 

$q = "SELECT * FROM news WHERE `end` >= '" . $todays_date . "' AND `start` >= '" . $todays_date . "' ORDER BY id DESC"; 

Le problème est que la requête tire toujours des résultats où la date de début est plus grande qu'aujourd'hui. Alors je modifié mon requête pour ressembler à ceci:

$q = "SELECT * FROM news WHERE `end` >= '" . $todays_date . "' AND `start` >= '" . $todays_date . "' AND `start` <='" . $todays_date . "' ORDER BY id DESC"; 

Est-ce la manière correcte de données de sélection entre les deux champs datetime qui utilise la date d'aujourd'hui comme un limiteur?

Merci

Répondre

2

Vous avez> = dans les deux conditions.

0

Vous pouvez utiliser la fonction mysql curdate() pour obtenir la date du 2010-01-05, ou now() pour obtenir le format datetime complet 2010-01-05 12:55:09. Cela dépend si vous voulez trouver des éléments qui commencent aujourd'hui ou commencent dès maintenant.

Et en supposant que vous n'avez pas encore entrées qui se terminent avant de commencer, vous pouvez réécrire la requête comme

select * from news where start = curdate() 

Il est probablement une bonne idée de vérifier vos dates de fin aussi. Et il semble que vous êtes à la recherche d'une liste des articles de presse qui ont déjà commencé, mais pas encore pris fin, de sorte que la requête ressemble à ceci

select * from news where start < now() and end > now() 

Vous devriez même être en mesure de le faire, même si je n'ai pas testé

select * from news where now() between start and end 

Votre consommation peut varier.

--Mark

5

Vous pouvez utiliser la fonction maintenant timedate dans MySQL et l'opérateur BETWEEN.

Raw SQL:

SELECT * FROM news 
WHERE NOW() BETWEEN start AND end; 

Note: Soyez conscient du décalage horaire par défaut, ce qui affecte la fonction NOW(), utilisée par le serveur fournissant votre ressource MySQL.

0

Merci à tous je me suis retrouvé à l'aide:

select * 
from news 
where start = curdate() 

J'ai essayé

SELECT * 
FROM news 
WHERE NOW() BETWEEN start AND end; 

et cela a fonctionné presque correctement. Il ne voulait pas montrer des articles de presse qui ont commencé et se sont terminés le même jour en même temps.

-tegan

0

Cela fonctionne pour moi. select * from news where start between '$range1' and '$range2'