如何在mysql中根据出生日期计算的年龄计算和应用条件?

时间:2020-07-11 17:48:27

标签: mysql jpa spring-data-jpa

我正在根据用户的Dob计算用户的年龄:

knn.predict(X_test)

这给了我正确的年龄。现在我该如何应用条件。例如,当我尝试这样做时,它给了我错误:

SELECT DATE_FORMAT(FROM_DAYS(DATEDIFF(now(),u.date_of_birth)), '%Y')+0 AS Age from users u ;

我知道此语法不正确,但是如何在mysql和Java端的JPA中对其应用条件。

2 个答案:

答案 0 :(得分:0)

您不能直接在Age子句中使用别名Where,因为该别名当时尚未计算出来。相反,您需要使用完整表达式(Select子句中用于计算年龄的表达式)。

以下查询应能工作:

   SELECT DATE_FORMAT(FROM_DAYS(DATEDIFF(now(),u.date_of_birth)), '%Y')+0 AS Age 
   from users u 
   where DATE_FORMAT(FROM_DAYS(DATEDIFF(now(),u.date_of_birth)), '%Y')+0 >20;

我认为,要更好地理解这一点,您应该知道一个SQL查询实际上是如何执行的。请同样通过this answer

另外,我认为在同一查询的2个地方计算Age并不是最好的方法。假设您在表Users中有一个唯一列,我们将其称为Id。现在,您可以使用以下查询以更好的方法来完成此操作:

Select u2.Id, u2.age
from users u1
inner join 
          (select id,
                  DATE_FORMAT(FROM_DAYS(DATEDIFF(now(),u.date_of_birth)), '%Y')+0 AS Age 
           from users
          ) u2
On u1.id = u2.id
where u2.age > 20

希望这会有所帮助!

答案 1 :(得分:0)

要在Java中使用它进行sql查询,您需要 preparedStatement 声明。对于准备好的语句,请使用以下几行:

String sql = "SELECT * 
             FROM users
             WHERE date_of_birth > DATE_SUB(NOW(),INTERVAL ? YEAR);"

PreparedStatement preparedStatement = connection.prepareStatement(sql);

preparedStatement.setInt(1, "20");
preparedStatement.executeQuery(sql);

您的查询应该是这个:

SELECT date_of_birth    
FROM users
WHERE date_of_birth > DATE_SUB(NOW(),INTERVAL 20 YEAR);