[英]MySQL select dates between with date functions and min max
为什么返回“ 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是一个日期字段。
我认为您会发现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')
)来获取之间的语句中使用的日,月和年。
您的第一个示例包含聚合函数。 HAVING通常需要GROUP BY,因为这是过滤组的一种方法。 因此,将GROUP BY date
放在HAVING date
GROUP BY date
之前会使您同时获得19号和20号(对于您的第一个SQL语句)。
这是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);
不知道哪一个是最快的...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.