MySQL Update юбилейная дата

0

Я работаю над проектом и не могу обновить поле даты (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
    Пожалуйста, поделитесь структурой таблицы (соответствующие столбцы) двух таблиц, упомянутых здесь.
  • 1
    Что такое годовщина ?
Показать ещё 9 комментариев
Теги:

3 ответа

0

Сначала мы должны ответить на этот вопрос: когда был последним юбилеем пользователя?

Ответ на этот вопрос: Сегодня 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
;
  • 0
    Спасибо за помощь! : D
0

Я понимаю, что вам нужно условное обновление, поэтому вместо того, где вы можете использовать случай, когда из-за отсутствия структуры таблицы сложно дать желаемый ответ

 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
  • 0
    Прекрасно использовать случай, чтобы избежать двух запросов, теперь только трудная часть отсутствует. Получить дату годовщины, если registration_date дата = '2012-01-20' Дата годовщины должна быть = '2018-01-20'.
  • 0
    Я изменил ответ, который вы можете проверить сейчас
Показать ещё 9 комментариев
0

Предположим, вы используете 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;
  • 0
    Я ищу последнюю годовщину, значит, если user_registered это «2012-01-20», последняя годовщина должна быть «2018-01-20».

Ещё вопросы

Сообщество Overcoder
Наверх
Меню