2015-07-31 2 views
0

я сделал INSERT INTO данных из таблицы импорта в новую таблицу, я создал, который имеет общую информацию о людях, имя, адрес, DOB, возраст, пол и т.д.SQL обновление возраст, когда = текущая дата

Когда я сделал вставку в мои новые таблицы, данные импорта не имеют возраст для людей, так что я сделал следующее после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; 

Мой вопрос: Как я могу сделать обновление на основе, когда их д.р. = текущая дата?

Это то, что я пробовал:

UPDATE table_a set age = (SELECT timestampdiff(year, dob, curdate()) AS age WHERE DAYOFYEAR(dob) - DAYOFYEAR(CURDATE()) = 0); 

Это ошибка, я получаю:

Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE DAYOFYEAR(dob) - DAYOFYEAR(CURDATE()) = 0)' at line 1

Я не понимаю, что я делаю неправильно ...

Запуск MySQL 5.6.25

Благодарим вас за любые ответы.

+0

Попробуйте удалить 'AS Age' – artm

+0

Поскольку возраст постоянно меняется, вы, вероятно, не хотите хранить его в базе данных, а скорее вычисляете его, когда вам нужно знать возраст. В противном случае вам придется обновлять его каждый день, чтобы он был точным. – jpw

+0

Я занимаюсь этим с помощью php, и у меня есть это, где, если они, ищут человека, он проверит чек, чтобы узнать, что у них есть, и ЕСЛИ его сегодня, обновите возраст в этот момент. Но, да, я вижу вашу мысль. – devNub

ответ

1

EDIT:

Это вопрос, который необходимо обновить для пользователей, у которых 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, так как он считает високосные годы, то есть этот метод вернет 212 для 2015-07-31, но вернет 213 для 2012-07-31.

Во-вторых, чтобы использовать ту же таблицу в запросе update, ее следует использовать как временную таблицу. Объяснение here.


Причина ошибки SQL Синтаксис является то, что вам не хватает FROM положение в внутреннем запросе. т.е. SELECT timestampdiff(year, dob, curdate()) AS age WHERE .... Добавить FROM table_a.

+0

Я попробовал ваше предложение его говорить мне это: UPDATE TABLE_A набор возраст = (SELECT timestampdiff (год, DOB, CurDate()) как возраст от TABLE_A ГДЕ DAYOFYEAR (д.р.) - DAYOFYEAR (CURDATE()) = 0); Код ошибки: 1093. Вы не можете указать целевую таблицу 'table_a' для обновления в разделе FROM – devNub

+0

http://stackoverflow.com/questions/9285143/mysql-you-cant-specify-target-table-a-for -update-in-from-clause – splash58

+0

Обновлен ответ рабочим запросом и sqlfiddle. – AimZ

0

Вы можете использовать тот же ИНЕКЕ для вашего обновления, как в примере:

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); 

И он отлично работает с MySQL 5.6 в Sqlfiddle

+0

Аналогичная ошибка: Код ошибки: 1093. Вы не можете указать целевую таблицу 'table_a' для обновления в предложении FROM – devNub

+0

Я даже попытался сбрасывать результаты в таблицу темп, а затем попытался вытащить из таблицы temp, чтобы выполнить обновление, и это дал мне такую ​​же ошибку. – devNub

+0

Не могли бы вы попытаться получить точный текст для обновления, который я недавно добавил в ответ? –

Смежные вопросы