2016-10-04 86 views
1

我试图从MySQL中选择和按日期分组。sql select和group by CURRENT_TIMESTAMP

表看起来像这样:

`id` int(11) NOT NULL, 
    `run_data` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    `date_day` varchar(20) NOT NULL, 
    `number_of_links` int(20) NOT NULL, 

的选择,我使用:

SELECT date_day, SUM(number_of_links) FROM my_table GROUP BY date_day DESC LIMIT 30 

我得到的每一天链接总数,但我不能按日期排序。从我的数据库date_day只是︰

$date_day = date('d/m/Y', time()); 

任何想法如何解决这个问题?

我试过到目前为止:

GROUP BY TO_DAYS(`run_data`) 
GROUP BY MONTH(run_data) 
GROUP BY DATE(STR_TO_DATE(run_data)); 
+1

也许愚蠢的问题,但你为什么不保持你的日期在合适的日期列格式?如日期 – nospor

+0

现在你是复杂的那么简单的事情 – nospor

+0

你能告诉保存表格内 –

回答

1

您的date_day字段不可排序。至少不要除非你为它编写自定义逻辑,这通常是用PHP完成的;或者在每个查询上进行投射,这对数据库来说可能非常昂贵(更不用说提供不正确的结果)。

如由@nospor注释中,正确回答这个问题是改变的领域是正确的date场。然后,您可以轻松地对其进行分类和/或分组。
要做到这一点,我建议就在的ALTER TABLE语法仰视。

+0

谢谢你,怎么样'run_data'日期时间NOT NULL DEFAULT CURRENT_TIMESTAMP,?我可以使用它吗? – fernando

+0

这取决于它是否包含与'date_day'字段相同的数据。由于我不知道答案,所以我不能肯定地说。但是,如果它们包含相同的数据,为什么有两个字段呢? – ChristianF

0

date_dayvarchar型的,所以要排序date_day你的结果,你必须将它转换成date数据类型,就像这样:

SELECT date_day, SUM(number_of_links) 
FROM my_table 
GROUP BY date_day 
ORDER BY CAST(date_day AS DATE()) DESC 
LIMIT 30 
+0

@Toby谢谢你告诉我 – Ashu

1

假设你date_day存储像“D/M/Y”你shold字符串转换的日期格式的字符串

SELECT date_day, SUM(number_of_links) 
FROM my_table 
GROUP BY date_day 
ORDER BY str_to_date(date_day, '%d/%m/%Y') DESC 
LIMIT 30 
+0

有什么格式的他有一个字符串...请不要假设已经给出的东西。 – nospor

+0

@nospor ..在表中的列是一个varchar和我的答案在那里开始对格式 – scaisEdge

+0

他正好在他有什么格式的日期表示警报......这是“D/M/Y”不你认为DD-MM-YYYY – nospor