Porównaj ceny domen i usług IT, sprzedawców z całego świata

MYSQL: Porównanie daty NULL z CURRENT_DATE


Mam tabelę MYSQL artykułów z wiadomościami z polami „date_start” i „date_end”, aby określić, które wiadomości mają być wyświetlane w witrynie. Artykuły są publicznie dostępne, jeśli data_start jest wcześniejsza niż dzisiaj, a data_end nie minęła (po dniu dzisiejszym).
Problem:
Chciałbym, aby administrator zostawił date_end NULL, jeśli artykuł jest trwały i nie wygasa. To oczywiście nie działa z moim wyborem:
SELECT * FROM pf_news WHERE date_start <= CURRENT_DATE() AND date_end >= CURRENT_DATE()

Pozostawia artykuły z
NULL date_end
. Próbowałem trochę majstrować przy stwierdzeniach IF, ale to mnie zmyliło. Czy istnieje łatwy sposób, aby to zrobić, czy też powinienem ustawić date_end na
3000-01-01
, jeśli pozostanie pusta? :)
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Możesz spróbować:
SELECT * FROM pf_news WHERE date_start <= CURRENT_DATE() AND 
(date_end >= CURRENT_DATE() OR date_end IS NULL)

lub inne podobne grupowanie logiczne.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Twoje ostatnie zdanie brzmi dobrze. Możesz użyć funkcji IFNULL. Ma dwa argumenty. Jeśli pierwszy argument nie ma wartości null, zwraca pierwszy argument. Drugi argument to wartość zwracana, jeśli pierwszy argument ma wartość null. Dlatego w swoim oświadczeniu możesz powiedzieć:
SELECT * FROM pf_news WHERE date_start <= CURRENT_DATE() AND IFNULL(date_end, '3000-01-01') >= CURRENT_DATE()

Można tego również użyć w SQL Server, ale nazywają to funkcją „ISNULL”.
Po prostu ustaw sobie przypomnienie kalendarza na 31.12.1999, aby zmienić kod! :)
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Od tego małego pytania, chcesz jedno z nich
A] date_end jest większa niż teraz lub jeśli jest pusta
SELECT * FROM pf_news 
WHERE date_start <= CURRENT_DATE() AND (date_end >= CURRENT_DATE() OR date_end IS NULL )

B] date_end musi być obecna i większa niż data bieżąca
SELECT * FROM pf_news 
WHERE date_start <= CURRENT_DATE() AND
date_end >= CURRENT_DATE() AND
date_end IS NOT NULL
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

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

0 wydaje się działać dobrze dla mnie
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jednak inną możliwością jest użycie COALESCE, zwraca on pierwszą niezerową wartość z listy:
SELECT * FROM pf_news WHERE date_start <= CURRENT_DATE() AND 
COALESCE(date_end,'9999-1-1') >= CURRENT_DATE()

Zatem jeśli
date_end
ma wartość NULL, to w porównaniu zostanie użyta przyszła data „9999-1-1”.
Ale po tej dacie pęknie :-)

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się