繁体   English   中英

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

[英]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_formatDATE_FORMAT(date_time_var, '%Y-%m-%d') )来获取之间的语句中使用的日,月和年。

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

这是HAVING行为。

HAVING意志集团导致你的第一个查询,因为有一组函数MAXHAVING子句。 因为没有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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM