2012-09-02 1 views
0

j'ai écrit la requête suivante qui tenterait de sélectionner tous les événements où la date de départ est quelque chose de date (je start_date et champs date_fin dans le tableau):mysql ne pas inscrire logiquement

$query = "SELECT id,title,start_date 
      FROM events 
      WHERE start_date > NOW() - INTERVAL 30 DAY AND city = '$cityName' 
      ORDER BY start_date DESC"; 

La seule problème avec le code ci-dessus comme je me suis rendu compte était que si un événement a commencé disons 3 mois avant NOW() alors il ne serait pas affiché. Je suis allé et j'ai essayé de le réécrire, mais ça n'a pas marché. ce que je réussi:

"SELECT id,title,start_date 
FROM events 
WHERE start_date >= NOW() - INTERVAL 30 DAY || start_date <= NOW() && end_date >= NOW() - INTERVAL 30 DAY"; 

Ce que j'ai essayé de faire est de sélectionner tous les événements où la date de début est supérieure ou égale date (NOW()) ou même certains événements avec start_date qui peuvent être moins encore que la date actuelle la date de fin est après NOW(). Des suggestions sur la façon dont cela devrait être réparé? Je veux qu'il montre tous les événements tant qu'ils ne sont pas déjà passés (bien sûr, cela signifie que la date de fin n'est pas inférieure à la date réelle actuelle).

Merci,

EDIT:

$query = "SELECT id,title,start_date FROM events WHERE start_date > NOW() - INTERVAL 30 DAY AND city = '$cityName' ORDER BY start_date DESC"; 

$query_posted = "SELECT id,title,start_date FROM events WHERE start_date > DATE_SUB(NOW(), INTERVAL 1 MONTH) AND city = '$cityName' AND category = '$tag' ORDER BY start_date DESC"; 

le premier chargé des événements après je l'ai modifié (modification non inclus), mais deuxième a échoué et je pense que cela est dû à deux autres et de l' fin.

+1

'bien sûr cela signifie date de fin n'est pas moins date' courant réel Ne serait-ce que signifie que vous avez besoin' WHERE date_fin> = maintenant() '? – lanzz

+0

@lanzz: Pourquoi n'écrivez-vous pas cela comme une réponse? –

Répondre

1

Voici ce que vous demandez s'il a été exécuté ce moment.

WHERE start_date >= 2012-08-03 || start_date <= 2012-09-02 && end_date >= 2012-08-03 

Pour que cela fonctionne, vous devez utiliser des parenthèses pour séparer les comparaisons.

WHERE start_date >= NOW() - INTERVAL 30 DAY || (start_date <= NOW() && end_date >= NOW() - INTERVAL 30 DAY) 

Vous pouvez également utiliser l'opérateur BETWEEN:

WHERE start_date BETWEEN NOW() - INTERVAL 30 DAY AND NOW() 
    AND end_date >= NOW() - INTERVAL 30 DAY 

Enfin, vous dites que vous voulez que le end_date soit supérieur à NOW(). Il suffit donc de laisser tomber le - INTERVAL 30 DAY pour obtenir:

WHERE start_date BETWEEN NOW() - INTERVAL 30 DAY AND NOW() AND end_date >= NOW() 
+0

J'ai essayé le dernier sans intervalle et cela n'a pas fonctionné. La question modifiée pour ajouter une autre partie du code qui peut avoir rendu votre code défectueux –

Questions connexes