MySQL GROUP BY YEAR(),MONTH()有时在月初返回日期,有时在结束时返回日期

时间:2014-01-16 00:51:51

标签: mysql sql date group-by

我有一个表Calendar,其中包含一列,datefield(类型Date)。它包含2013年1月1日至2014年12月31日期间的每个日期。

我使用GROUP BY按月/年分组,预期结果是获取所选范围的每个月的第一个日期。

这是我的问题:

SELECT 
  datefield 
FROM 
  Calendar 
WHERE
  datefield >= cast('20131001' as date)
  AND datefield <= cast('20140115' as date)
group by
YEAR(datefield),
MONTH(datefield)

结果如下:

+----------+
|datefield |
+----------+
|2013-10-01|
+----------+
|2013-11-01|
+----------+
|2013-12-31|
+----------+
|2014-01-15|
+----------+

最后两个结果不是我所期望的:我期待2013-12-01和2014-01-01。如果我将日期范围稍后扩展到2014,则模式将继续:日期是每个月的最后日期,而不是第一个日期,列出的最后日期是我的WHERE子句的结束日期。

  1. 为什么最后两个结果是从我分组的时间段结束时开始的,而不是从头开始?
  2. 如何调整查询以获得预期值(12-01和01-01)?
  3. (请不要建议我删除日历表或使用其他方法来获取每个月的第一天。虽然它们可能在更广泛的意义上有用,但它们不回答我的问题。但是,有关正确的建议谷歌搜索这种现象的条款将被接受,因为我不知道它叫什么。)

1 个答案:

答案 0 :(得分:1)

在分组时选择列时,它会从组中的随机行中获取该列。如果你想要一个特定的值,你必须使用聚合函数这样说:

SELECT MIN(datefield) first_day_of_month
FROM Calendar
GROUP BY YEAR(datefield), MONTH(datefield)