MySQL / SQL:仅在Datetime列上按日期分组


181

有一个带有列的表,如:mydate DATETIME...

我有一个查询,例如:

SELECT SUM(foo), mydate FROM a_table GROUP BY a_table.mydate;

这将按完整的分组datetime,包括小时和分钟。我希望按日期分组,YYYY/MM/DD而不按日期分组YYYY/MM/DD/HH/mm

有人知道怎么做吗?我仍然可以在我的代码中动态地执行此操作(因为我是atm),但是我正在清理垃圾代码,并且可以通过SQL来完成此操作,但我不知道如何:(。


1
这个答案中描述的更好的方法!
webcoder

Answers:


287

将datetime强制转换为日期,然后使用以下语法将GROUP BY强制转换为:

SELECT SUM(foo), DATE(mydate) FROM a_table GROUP BY DATE(a_table.mydate);

或者,您也可以按照@ orlandu63建议使用GROUP BY别名:

SELECT SUM(foo), DATE(mydate) DateOnly FROM a_table GROUP BY DateOnly;

尽管我认为这不会对性能产生任何影响,但它会更清晰一些。


1
您确定第二个有效吗?在SQL Server上,此操作失败,并且失败的原因很充分。我希望它也会在其他任何地方失败。您可以确认MySQL确实处理了该查询吗?
Tomalak

1
我刚试过,它工作正常。MySQL对GROUP BY更为宽容,它信任您编写不明确的查询。
Bill Karwin

谢谢(你的)信息。我无法确定这是否是一件好事,但它非常适合我对MySQL的看法。从技术角度来看-这应该如何工作?我只能想象查询解析器将GROUP BY子句中的别名替换为实际表达式。
Tomalak

17
这是一个性能陷阱!请记住,使用这样的函数-DATE()不允许您利用此列上的索引。
卡米尔·贝德纳兹

我用了第一个,它就像一个魅力。感谢您的贴士
Helen Neely

20

我发现我需要按月和年分组,因此以上两种都不适合我。相反,我使用date_format

SELECT date
FROM blog 
GROUP BY DATE_FORMAT(date, "%m-%y")
ORDER BY YEAR(date) DESC, MONTH(date) DESC 

2
查询出了毛病
宅急送

18

要么:

SELECT SUM(foo), DATE(mydate) mydate FROM a_table GROUP BY mydate;

效率更高(我认为。)因为您不必每行都两次转换mydate。


7
如果MySQL运行两次转换,我会感到非常惊讶。select语句中仅允许group by列表中的聚合函数和表达式。引擎已经必须知道这两个表达式是相同的。
Tmdean

1
@Tmdean,“在按选择分组的语句中仅允许按列表分组的聚合函数和表达式”-您能用更简单的语言来解释它吗?
Istiaque Ahmed

9
SELECT SUM(No), HOUR(dateofissue) 
FROM tablename 
WHERE dateofissue>='2011-07-30' 
GROUP BY HOUR(dateofissue)

它将给出特定日期的小时总和!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.