2010-06-30 3 views
6

J'ai une table MYSQL avec des articles d'actualité avec les champs "date_start" et "date_end" pour indiquer quelles nouvelles afficher sur un site web. Les articles sont publics si date_start est avant aujourd'hui et que date_end n'est pas déjà passé (après aujourd'hui).MYSQL: comparer une date NULL à CURRENT_DATE

Le problème: Je voudrais laisser l'administrateur quitter date_end NULL si l'article est de nature permanente et n'expire pas. Bien sûr, cela ne fonctionne pas avec ma sélection:

SELECT * FROM pf_news WHERE date_start <= CURRENT_DATE() AND date_end >= CURRENT_DATE() 

Il laisse des articles avec un NULL date_end. J'ai essayé de jouer un peu avec les instructions IF, mais cela a été source de confusion pour moi. Y a-t-il un moyen simple de le faire, ou devrais-je simplement mettre date_end à 3000-01-01 s'il est laissé vide? :)

Répondre

1

Du peu que je suis votre question que vous voulez un de ce

A] DATE_END plus que la date actuelle ou si elle est nulle

SELECT * FROM pf_news 
     WHERE date_start <= CURRENT_DATE() AND (date_end >= CURRENT_DATE() OR date_end is nil) 

B] DATE_END doit être présent et plus date

SELECT * FROM pf_news 
     WHERE date_start <= CURRENT_DATE() AND 
       date_end >= CURRENT_DATE() AND 
       date_end is not nil 
19

Vous pouvez essayer:

SELECT * FROM pf_news WHERE date_start <= CURRENT_DATE() AND 
(date_end >= CURRENT_DATE() OR date_end IS NULL) 

ou un groupement logique similaire.

+0

Merci les gars pour les réponses incroyablement rapides! Celui-ci fait absolument ce que je cherchais. C'était finalement assez facile :) – Ville

+0

:) Content d'être utile. –

+0

Upvote pour une grande justice! – SoonDead

0

ou essayez

SELECT * FROM pf_news WHERE date_start <= now() AND (date_end >= now() OR date_end = 0) 

0 semble fonctionner très bien pour moi

1

Votre dernière proposition semble correcte. Vous pouvez utiliser la fonction IFNULL. Il a deux arguments. Si le premier argument est non nul, il renvoie le premier argument. Le deuxième argument est ce que retourner si le premier argument est nul. Donc, dans votre déclaration, vous pouvez dire ceci:

SELECT * FROM pf_news WHERE date_start <= CURRENT_DATE() AND IFNULL(date_end, '3000-01-01') >= CURRENT_DATE() 

Cela peut également être utilisé dans SQL Server, mais ils l'appellent la fonction « ISNULL ».

Il vous suffit de créer un rappel de calendrier le 31/12/2999 pour changer votre code! :)

+0

J'ai réalisé que celui-ci est un peu un hack car il montrerait l'administrateur du site la date 3000-01-01 dans le formulaire d'édition :) – Ville

+0

Parce que l'instruction IFNULL est seulement dans la clause WHERE plutôt que la clause SELECT, alors le '3000-01-01' ne devrait jamais être retourné comme résultat de la requête. Au moins, cela a bien fonctionné pour moi dans le passé. – brentlightsey