Как рассчитать и применить условие к возрасту, рассчитанному на основе даты рождения в mysql? - PullRequest
0 голосов
/ 11 июля 2020

Я вычисляю возраст пользователя на основе его dob как:

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

И это дает мне правильный возраст. Как теперь применить условие к. Например, когда я пытаюсь это сделать, это выдает ошибку:

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

Я знаю, что этот синтаксис неверен, но как я могу применить к нему условие в mysql и в JPA на Java сторона.

Ответы [ 2 ]

0 голосов
/ 11 июля 2020

Чтобы использовать его sql запрос в Java, вам понадобится prepareStatement или оператор . Для подготовленного оператора используйте эти строки:

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);
0 голосов
/ 11 июля 2020

Вы не можете использовать псевдоним 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. Пожалуйста, от go до этот ответ для того же.

Кроме того, я думаю, что вычисление Age в двух местах одного и того же запроса - не лучший способ сделать это. Предположим, у вас есть уникальный столбец в таблице Users, и назовем его Id. Теперь вы можете выполнить sh то же самое с лучшим подходом со следующим запросом:

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

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...