我有一个包含两个字段name和date的表
+-------+------------+
| 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 |
+-------+------------+
我将数据的date now与date进行比较得到这个表
+-------+------------+
| name | Number |
+-------+------------+
| A | -4 day |
| C | -1 day |
| B | 0 day |
+-------+------------+
谢谢
您应该group by
每个名称,获得max
日期,并使用curdate()
来获得差异。使用DATE()
将datetime
转换为date
进行计算。
select name, max(DATE(datecolumn)) - curdate()
from tablename
group by name
order by max(DATE(datecolumn)) - curdate()
第一步是获取最新日期的列表。您可以在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
最后,要附加"days"部分,使用CONCAT
。
SELECT name, CONCAT(DATEDIFF(MAX(date), CURRENT_DATE()), " days") as Days
FROM names
GROUP BY name
您可以在SQLFiddle中使用它。
我建议不要在SQL中做最后一部分。你不会得到非常正确的格式("1 days"是错误的语法),数据作为数字更有用。相反,在您想要显示数据的地方进行格式化。