我有一个包含两个字段名称和日期的表
+-------+------------+
| 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 |
+-------+------------+
谢谢
答案 0 :(得分: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()
答案 1 :(得分: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天”是错误的语法),数据作为一个数字更有用。而是在要显示数据的位置进行格式化。