Я работаю над проектом и не могу обновить поле даты (YYYY-MM-DD), используя другое поле даты (YYYY-MM-DD). Я искал, и люди использовали хранимые процедуры и курсоры для повторения каждого результата, но я не уверен, что делать.
Поэтому мне нужно получить последнюю дату юбилея и обновить поле registration_date
если date
больше сегодняшней даты CURDATE()
.
wp_wf_golf_res - таблица для резервирования.
Это то, что у меня есть:
UPDATE wp_wf_golf_res
INNER JOIN wp_users ON wp_wf_golf_res.user_id = wp_users.ID
SET wp_wf_golf_res.registration_date = *anniversaryDate*
WHERE wp_wf_golf_res.date > CURDATE();
Таблица 1: wp_users Столбцы: ID (PK)
, user_registered
: wp_wf_golf_res Столбцы: id (PK)
, date
, registration_date
.
AnniversaryDate следует обновить в registration_date
если date
больше, чем сегодня. Если date
меньше, чем сегодня обновление registration_date
с user_registered
значения.
wp_users.user_registered
- это дата регистрации пользователя. wp_wf_golf_res.date
- дата резервирования. wp_wf_golf_res.registration_date
означает дату оговорки, например, журнал. И wp_wf_golf_res.registration_date
- это то, что нужно рассчитать и обновить в wp_wf_golf_res.registration_date
.
Сначала мы должны ответить на этот вопрос: когда был последним юбилеем пользователя?
Ответ на этот вопрос: Сегодня 3 сентября 2018. Так что, если дата регистрации пользователя была до 3 сентября, то в этом году была юбилей (например, 12 августа 2018 года). Если день регистрации пользователя был после 3 сентября, годовщина была в прошлом году (например, 1 ноября 2017 года).
(Ну, вы хотите включить сегодня в один из двух диапазонов, конечно, решите, что именно.)
Мы можем сравнивать месяц и день как строки (формат = две цифры за месяц, две цифры за день):
'0812' < '0903' < '1101'
Полный оператор обновления:
UPDATE wp_wf_golf_res r
INNER JOIN wp_users u ON r.user_id = u.id
SET r.registration_date =
CASE
WHEN r.date < current_date THEN
u.user_registered;
WHEN DATE_FORMAT(registration_date, '%m%d') < DATE_FORMAT(current_date, '%m%d') THEN
r.registration_date + INTERVAL YEAR(current_date) - YEAR(r.registration_date) YEAR
ELSE
r.registration_date + INTERVAL YEAR(current_date) - YEAR(r.registration_date) - 1 YEAR
END
;
Я понимаю, что вам нужно условное обновление, поэтому вместо того, где вы можете использовать случай, когда из-за отсутствия структуры таблицы сложно дать желаемый ответ
UPDATE wp_wf_golf_res INNER JOIN wp_users ON
wp_wf_golf_res.user_id = wp_users.ID
SET wp_wf_golf_res.registration_date = case when wp_wf_golf_res.date > CURDATE()
then date(concat(concat(year(now()),'-'),DATE_FORMAT(wp_wf_golf_res.registration_date, "%m-%d"))) when wp_wf_golf_res.date < CURDATE() then user_registered end
registration_date
дата = '2012-01-20' Дата годовщины должна быть = '2018-01-20'.
Предположим, вы используете Innodb, поскольку необходимы транзакции.
BEGIN;
SELECT {other fields}, DATE_ADD(wp_wf_golf_res.registration_date, INTERVAL 1 YEAR) AS anniversaryDate
FROM wp_wf_golf_res
INNER JOIN wp_users ON wp_wf_golf_res.user_id = wp_users.ID
WHERE wp_wf_golf_res.date > CURDATE()
FOR UPDATE;
UPDATE wp_wf_golf_res
INNER JOIN wp_users ON wp_wf_golf_res.user_id = wp_users.ID
SET wp_wf_golf_res.registration_date = DATE_ADD(wp_wf_golf_res.registration_date, INTERVAL 1 YEAR);
COMMIT;
user_registered
это «2012-01-20», последняя годовщина должна быть «2018-01-20».