2010-06-30 2 views
6

У меня есть таблица MYSQL с новостями с полями «date_start» и «date_end», чтобы указать, какие новости будут отображаться на веб-сайте. Статьи общедоступны, если date_start до сегодняшнего дня, а date_end еще не прошла (после сегодняшнего дня).MYSQL: сравнение даты NULL с CURRENT_DATE

Проблема: Я хочу, чтобы администратор оставил date_end NULL, если статья имеет постоянный характер и не истекает. Это, конечно, не работает с моим выбором:

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

Он выходит из статей с NULL date_end. Я попытался немного поиграть с инструкциями IF, но мне стало сложно. Есть ли простой способ сделать это, или я должен просто установить date_end в 3000-01-01, если он оставлен пустым? :)

ответ

1

От маленькой я получил свой вопрос, который вы хотите один из этой

A] date_end больше текущей даты или если она равна нулю

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

B] date_end должен присутствовать и более текущая дата

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

Вы можете попробовать:

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

или аналогичная логическая группировка.

+0

Спасибо, ребята, за удивительно быстрые ответы! Это делает абсолютно то, что я смотрю. Это было, наконец, довольно легко :) – Ville

+0

:) Рад помочь. –

+0

Upvote для большой справедливости! – SoonDead

0

или попробовать

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

0, кажется, работает очень хорошо для меня

1

Ваше последнее предложение звучит правильно. Вы можете использовать функцию IFNULL. Он имеет два аргумента. Если первый аргумент не равен null, он возвращает первый аргумент. Второй аргумент - это то, что нужно вернуть, если первый аргумент равен null. Так что в вашем заявлении, вы можете сказать следующее:

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

Это также может быть использован в SQL Server, но они называют это функция «ISNULL».

Просто установите напоминание о календаре для себя на 12/31/2999, чтобы изменить код! :)

+0

Я понял, что это немного взломать, поскольку он покажет администратору сайта дату 3000-01-01 в форме редактирования :) – Ville

+0

Поскольку оператор IFNULL находится только в предложении WHERE, а не в предложении SELECT, тогда «3000-01-01» никогда не должен возвращаться как результат запроса. По крайней мере, это хорошо сработало для меня в прошлом. – brentlightsey

Смежные вопросы