MySQL更新周年纪念日

时间:2018-09-13 07:27:45

标签: mysql sql

我正在一个项目上,使用另一个日期字段( 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表2:wp_wf_golf_res列:id (PK)dateregistration_date

如果registration_date大于今天,则

AnniversaryDate 应该更新为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中进行计算和更新的内容。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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;

答案 2 :(得分:0)

首先,我们必须回答这个问题:用户的上一次生日是什么时候?

这个问题的答案是:今天是2018年9月3日。因此,如果用户的注册日是9月3日之前,那么周年纪念日是今年(例如,2018年8月12日)。如果用户的注册日是9月3日之后,那么该周年纪念日是去年(例如,2017年11月1日)。

(嗯,您当然想将今天包括在两个范围之一中;决定哪个。)

我们可以将月份和日期作为字符串进行比较(格式=月份的两位数字,日期的两位):

'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
;