MySQL查询日期范围。怎么了?

时间:2011-09-08 17:08:29

标签: mysql sql

我有以下查询?

SELECT id_service, creation_date, SUM(ammount)
FROM transactions
WHERE DATE_FORMAT(creation_date, '%m/%d/%Y') BETWEEN '08/01/2011'  AND '08/30/2011'
AND id_service = 1
GROUP BY DAY(creation_date)
ORDER BY creation_date

我在特定服务的当天范围内进行交易 - 在这种情况下,服务1-,以及这些事件的总金额。

从未如此,在结果中我得到了2010年的日期!这是在范围之外。

id_service creation_date           ammount
1         2010-08-12 16:57:16   650    <---- WHY 2010???
1         2011-08-01 12:10:01   1735
1         2011-08-02 15:17:12   360
1         2011-08-04 22:05:27   555

非常感谢。

4 个答案:

答案 0 :(得分:2)

尝试

WHERE creation_date BETWEEN '2011-08-01' AND '2011-08-30'

您正在使用MySQL无法识别为日期的日期格式,因此它将它们视为字符串。

答案 1 :(得分:0)

因为您要比较字符串而不是日期。字符串08/12/2010确实位于08/01/201108/30/2011

之间

使用

WHERE creation_date BETWEEN '2011-08-01'  AND '2011-08-30'

代替。如有必要,请使用STR_TO_DATE()函数在右侧格式化值。

答案 2 :(得分:0)

这是你想要做的:

SELECT id_service, creation_date, SUM(ammount)
FROM transactions
WHERE DATE_FORMAT(creation_date, '%Y/%m/%d') BETWEEN '2011/08/01'  AND '2011/08/30'
AND id_service = 1
GROUP BY DAY(creation_date)
ORDER BY creation_date

您要将creation_date转换为以月开头的字符串,因此,是的,您提供的值之间的2010日期

如果creation_date实际上是一个日期,您可以简化为:

SELECT id_service, creation_date, SUM(ammount)
FROM transactions
WHERE creation_date BETWEEN '2011-08-01'  AND '2011-08-30'
AND id_service = 1
GROUP BY DAY(creation_date)
ORDER BY creation_date

答案 3 :(得分:0)

您正在对字符串进行范围比较。