mysql更新周年纪念日

bf1o4zei  于 2021-06-21  发布在  Mysql
关注(0)|答案(3)|浏览(208)

我正在处理一个项目,无法使用另一个日期字段(yyyy-mm-dd)更新日期字段(yyyy-mm-dd)。我搜索过,人们使用存储过程和游标来迭代每个结果,但我不知道该怎么办。
所以我需要得到最后一个周年纪念日并更新字段 registration_date 如果 date 大于今天的日期 CURDATE() .
wp\u wf\u golf\u 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\u用户列: ID (PK) , user_registered 表2:wp\u wf\u golf\u res列: id (PK) , date , registration_date .
周年纪念日应更新为 registration_date 如果 date 比今天更伟大。如果 date 小于今天更新 registration_dateuser_registered 价值观。 wp_users.user_registered 是用户注册的日期。 wp_wf_golf_res.date 是预订日期。 wp_wf_golf_res.registration_date 意思是预约的日期,就像日志一样。周年纪念日是需要计算和更新的 wp_wf_golf_res.registration_date .

0kjbasz6

0kjbasz61#

首先,我们必须回答这个问题:用户的最后一个周年纪念是什么时候?
这个问题的答案是:今天是2018年9月3日。因此,如果用户的注册日在9月3日之前,那么周年纪念日是今年(例如,2018年8月12日)。如果用户的注册日在9月3日之后,则该日期为去年(例如2017年11月1日)。
(当然,你要把今天包括在两个范围中的一个范围内;决定哪一个。)
我们可以将月和日作为字符串进行比较(格式=月两位数,日两位数):

'0812' < '0903' < '1101'

完整的update语句:

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

h79rfbju2#

所以假设您使用的是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;
flvlnr44

flvlnr443#

据我所知,你需要一个条件更新,所以当你不能使用case时,由于缺乏表结构,很难给出你想要的答案

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

相关问题