У меня есть вопрос относительно операторов case / if в MySQL в отношении обновления поля, основанного на возможности даты в поле. У меня есть два поля. Тот, который содержит дату («LastDayToNotify») и тот, который содержит текстовое сообщение («NotifyMessage»)

Поле даты может содержать одно из трех значений: пустое поле, пустое значение или дату.

Мой вопрос - возможно ли, и если да, то как в MySQL иметь запрос, который устанавливает значение одного поля (NotifyMessage) на основе того, прошла ли дата (LastDayToNotify)? Примером может быть:

Если дата не прошла (дата сегодня или раньше), обновите поле NotifyMessage, указав «Общее сообщение»

Но если поле даты пустое, пустое или передано, оно ничего не делает.

Я протестировал пару модификаций ответов в этой теме, но не смог успешно учесть все 3 возможных сценария дат. Здесь

Я знаю, что это, вероятно, вопрос новичка, но я никогда не сталкивался с этой конкретной потребностью.

Спасибо!

1
Robert Dickey 19 Сен 2017 в 18:05

3 ответа

Лучший ответ

Я предполагаю, что вы используете вменяемые типы полей (date или datetime) ...

UPDATE table
SET
    NotifyMessage = 'Generic Message'
WHERE
    LastDayToNotify IS NOT NULL
    AND LastDayToNotify >= CURDATE();

Если вы еще не храните даты в виде date типов, взгляните на: Преобразование даты в MySQL из строкового поля

1
wally 19 Сен 2017 в 15:10

По моему опыту, вы не можете установить значение с помощью оператора CASE, но вы можете что-то перечислить. Это, однако, будет отображаться в виде отдельного столбца.

НАПРИМЕР

    CASE WHEN date < SELECT DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0)
    THEN "Generic Message"
    ELSE 0 
    END AS 'Before Today'

Затем вам нужно будет создать больше операторов case, чтобы охватить другие сценарии, такие как NULL.

1
Ryan Gadsdon 19 Сен 2017 в 15:16

Вы можете использовать этот простой запрос:

UPDATE yourTable SET NotifyMessage = 'Generic Message'
WHERE LastDayToNotify <= CURDATE();
1
António Delgado 19 Сен 2017 в 15:21