У меня есть таблица MYSQL с новостными статьями с полями "date_start" и "date_end" для указания который новости показать на веб-сайте. Статьи общедоступны, если date_start, прежде сегодня и date_end уже не прошел (после сегодня).
Проблема: я хотел бы позволить администратору оставить date_end ПУСТОЙ УКАЗАТЕЛЬ, если статья имеет постоянный характер и не истекает. Это, конечно, не работает с моим выбором:
SELECT * FROM pf_news WHERE date_start <= CURRENT_DATE() AND date_end >= CURRENT_DATE()
Это не учитывает статьи с a NULL date_end
. Я пытался играть немного с операторами IF, но это стало сбивающим с толку меня. Есть ли простой способ сделать это, или если я просто установил date_end на 3000-01-01
если это оставило пустым?:)
Из того, что я получил ваш вопрос, вы хотите, чтобы одна из этих
A] date_end была больше текущей даты или если она пуста
SELECT * FROM pf_news
WHERE date_start <= CURRENT_DATE() AND (date_end >= CURRENT_DATE() OR date_end IS NULL )
B] date_end должна присутствовать и быть больше текущей даты
SELECT * FROM pf_news
WHERE date_start <= CURRENT_DATE() AND
date_end >= CURRENT_DATE() AND
date_end IS NOT NULL
Вы можете попробовать:
SELECT * FROM pf_news WHERE date_start <= CURRENT_DATE() AND
(date_end >= CURRENT_DATE() OR date_end IS NULL)
или другую подобную логическую группировку.
Ваше последнее предложение звучит правильно. Вы можете использовать функцию 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, чтобы изменить свой код! :)
или попробуйте
SELECT * FROM pf_news WHERE date_start <= now() AND (date_end >= now() OR date_end = 0)
0, кажется, мне подходит