当它=当前日期时,SQL年龄更新

时间:2015-07-31 14:12:16

标签: mysql

我从导入表中将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

提前感谢您的回复。

2 个答案:

答案 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')
)

SQLFIDDLE

您不能使用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)

Sqlfiddle

要更新的完整查询文字:

 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