我有一个表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子句的结束日期。
(请不要建议我删除日历表或使用其他方法来获取每个月的第一天。虽然它们可能在更广泛的意义上有用,但它们不回答我的问题。但是,有关正确的建议谷歌搜索这种现象的条款将被接受,因为我不知道它叫什么。)
答案 0 :(得分:1)
在分组时选择列时,它会从组中的随机行中获取该列。如果你想要一个特定的值,你必须使用聚合函数这样说:
SELECT MIN(datefield) first_day_of_month
FROM Calendar
GROUP BY YEAR(datefield), MONTH(datefield)