我正在一个项目上,使用另一个日期字段( 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)
,date
,registration_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
中进行计算和更新的内容。
答案 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
;