2015-10-03 2 views
2

У меня есть таблица, которая содержит два поля имя и датуSQL и получить номер для дублирования данных, используя эталонную дату

+-------+------------+ 
| name | date  | 
+-------+------------+ 
| B  | 28-09-2015 | 
| A  | 28-09-2015 | 
| B  | 29-09-2015 | 
| A  | 29-09-2015 | 
| B  | 30-09-2015 | 
| A  | 30-09-2015 | 
| B  | 01-10-2015 | 
| C  | 01-10-2015 | 
| B  | 02-10-2015 | 
| B  | 03-10-2015 | 
| C  | 03-10-2015 | 
| B  | 04-10-2015 | 
+-------+------------+ 

Я пошел сравнить дату теперь с датой для моих данных и получить эту таблицу

+-------+------------+ 
    | name | Number  | 
    +-------+------------+ 
    | A  | -4 day  | 
    | C  | -1 day  | 
    | B  | 0 day  | 
    +-------+------------+ 

Спасибо

+2

Пожалуйста, объясните свою логику в деталях. –

+0

Я пошел получить последнюю запись любого имени и скомпоновать его дату с датой сейчас и получить, сколько у меня есть уважение – Ruydo

+1

Какой тип столбца даты? – Schwern

ответ

1

Первый шаг - получить список новейших дат. Вы можете использовать это с MAX(date), но только это даст вам самую новую дату в таблице. Вы можете указать базу данных, в которой вы хотите ввести самую новую дату: за имя с оговоркой GROUP BY. В этом случае GROUP BY name.

SELECT name, MAX(date) 
FROM names 
GROUP BY name 

Теперь вы можете сделать некоторые даты математику на MAX(date), чтобы определить, сколько ему лет. MySQL имеет DATEDIFF, чтобы получить разницу между двумя датами в днях. CURRENT_DATE() дает текущую дату. Итак, DATEDIFF(MAX(date), CURRENT_DATE()).

SELECT name, DATEDIFF(MAX(date), CURRENT_DATE()) as Days 
FROM names 
GROUP BY name 

Наконец, чтобы добавить в "дни" часть, используйте CONCAT.

SELECT name, CONCAT(DATEDIFF(MAX(date), CURRENT_DATE()), " days") as Days 
FROM names 
GROUP BY name 

play around with it in SQLFiddle.

Я бы порекомендовал не делая это последняя часть в SQL. Вы не будете правильно форматировать («1 день» - это плохая грамматика), и данные более полезны в качестве числа. Вместо этого сделайте форматирование в точке, в которой вы хотите отображать данные.

3

Вы должны group by каждое имя, получить max дату и использовать curdate(), чтобы получить разницу. Используйте DATE() для преобразования с datetime в date для расчета.

select name, max(DATE(datecolumn)) - curdate() 
from tablename 
group by name 
order by max(DATE(datecolumn)) - curdate() 
Смежные вопросы