我从导入表中将INSERT INTO
数据导入到我创建的新表中,该表包含有关人员,姓名,地址,dob,年龄,性别等的一般信息。
当我插入新表时,导入数据没有人的年龄,所以我在 INSERT INTO
后执行了以下:
UPDATE table_a set age = (SELECT timestampdiff(year, dob, curdate()) AS age);
立即给了我每个人的年龄并相应地更新了专栏。
现在我想知道谁根据当前日期过生日:
SELECT name, dob FROM table_a WHERE DAYOFYEAR(dob) - DAYOFYEAR(CURDATE()) = 0;
我的问题是:如何根据dob =当前日期进行更新?
这就是我的尝试:
UPDATE table_a set age = (SELECT timestampdiff(year, dob, curdate()) AS age WHERE DAYOFYEAR(dob) - DAYOFYEAR(CURDATE()) = 0);
这是我得到的错误:
错误代码:1064。您的SQL语法有错误;检查 手册,对应右边的MySQL服务器版本 在'WHERE DAYOFYEAR(dob)附近使用的语法 - DAYOFYEAR(CURDATE())= 0)' 在第1行
我不明白我做错了什么......
运行MySQL 5.6.25
提前感谢您的回复。
答案 0 :(得分:1)
修改强>
这是您在当天有dob
的用户更新年龄所需的查询。
UPDATE table_a a
SET a.age = TIMESTAMPDIFF(YEAR, dob, CURDATE())
WHERE a.id IN (
SELECT id
FROM (SELECT * FROM table_a) AS temp_table
WHERE DATE_FORMAT(dob,'%m-%d') = DATE_FORMAT(CURDATE(),'%m-%d')
)
您不能使用DAYOFYEAR
,因为它会考虑闰年,即2015-07-31
此方法将返回212,2012-07-31
将返回213。
其次,要在update
查询中使用相同的表,它应该用作临时表。解释here。
SQL语法错误的原因是您在内部查询中缺少FROM
子句。即SELECT timestampdiff(year, dob, curdate()) AS age WHERE ...
。添加FROM table_a
。
答案 1 :(得分:0)
您可以为更新使用相同的WHERE子句,例如:
SELECT name, dob FROM table_a
WHERE MONTH(dob) = MONTH(CURRENT_TIMESTAMP) AND
DAYOFMONTH(dob) = DAYOFMONTH(CURRENT_TIMESTAMP)
要更新的完整查询文字:
UPDATE
table_a set
age = timestampdiff(year, dob, curdate())
WHERE MONTH(dob) = MONTH(CURRENT_TIMESTAMP) AND
DAYOFMONTH(dob) = DAYOFMONTH(CURRENT_TIMESTAMP);
它适用于Sqlfiddle
中的MySQL 5.6