SQL foreach表和使用引用日期获取重复数据的数字

时间:2015-10-03 23:47:11

标签: mysql 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 :(得分: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天”是错误的语法),数据作为一个数字更有用。而是在要显示数据的位置进行格式化。