为什么这会返回'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是日期字段。
答案 0 :(得分:0)
我认为您会发现date_sub
会返回完整时间戳,例如' 2008-11-11 13:23:44.657'有关详细信息,请参阅http://www.w3schools.com/sql/func_date_sub.asp。
您希望使用extract
方法或date_format
(DATE_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);
不确定哪一个是最快的......