MySQL选择日期函数和最小最大值之间的日期

时间:2015-01-19 09:25:14

标签: mysql date between

为什么这会返回'2015-01-19'?:

SELECT date
FROM hours 
HAVING date BETWEEN DATE_SUB(max(date), INTERVAL 2 DAY) AND DATE_ADD(max(date), INTERVAL 1 DAY)

何时返回'2015-01-20'和'2015-01-19'?:

SELECT date 
FROM hours 
HAVING date BETWEEN '2015-01-18' AND '2015-01-21'

最长日期为'2015-01-20',并且'2015-01-20'和'2015-01-19'都有记录。 date是日期字段。

3 个答案:

答案 0 :(得分:0)

我认为您会发现date_sub会返回完整时间戳,例如' 2008-11-11 13:23:44.657'有关详细信息,请参阅http://www.w3schools.com/sql/func_date_sub.asp

您希望使用extract方法或date_formatDATE_FORMAT(date_time_var, '%Y-%m-%d'))来获取您的中间语句中使用的日,月和年。

答案 1 :(得分:0)

您的第一个示例包含聚合函数。 HAVING通常需要GROUP BY,因为它是一种过滤组的方法。因此,将GROUP BY date放在HAVING date之前将获得第19和第20个(第一个SQL语句)。

答案 2 :(得分:0)

HAVING行为。

HAVING 分组会导致您的第一个查询,因为MAX子句中存在分组函数HAVING所有返回的行将分组在一个行组中,因为没有GROUP BY指令。因此,您只能得到一个结果。此组的date值可以是任何分组行。

HAVING将在第二个查询中不执行任何组,因为HAVING子句中没有分组函数,也没有GROUP BY指令。

根据建议添加GROUP BY date会对具有相同date的行进行分组;因此MAX只返回date值,而不是所有日期的MAX。因此,您将检索所有行,因为所有分组行中都有MAX(date) == date


SELECT `date`, GROUP_CONCAT(`date`), (SELECT MAX(`date`) FROM `hours`) AS `md`
FROM `hours`
GROUP BY `date`
HAVING `date`
BETWEEN DATE_SUB(md, INTERVAL 2 DAY) AND DATE_SUB(md, INTERVAL 1 DAY);

您也可以使用

SELECT `hours`.`date`, `md`.`d`
FROM `hours`, (SELECT MAX(`date`) AS `d` FROM `hours`) AS `md`
WHERE `hours`.`date`
BETWEEN DATE_SUB(`md`.`d`, INTERVAL 2 DAY) AND DATE_ADD(`md`.`d`, INTERVAL 1 DAY);

不确定哪一个是最快的......