【问题标题】:MySQL select dates between with date functions and min maxMySQL 在日期函数和最小最大值之间选择日期
【发布时间】:2015-01-19 09:25:14
【问题描述】:

为什么会返回“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 是一个日期字段。

【问题讨论】:

  • 你能再解释一下吗?在哪种情况下? hours中有什么数据?
  • 按工作日期的工作时间和其他用户/员工相关数据。可以包含针对一个用户/员工的特定日期的多条记录。我实际上想为日期间隔返回 * 而不仅仅是日期。当使用后一个查询时,phpmyadmin 实际上将 ORDER BY 'time' DESC 添加到查询的末尾。不知道为什么...
  • 你忘了把GROUP BY date放在HAVING date之前..

标签: mysql date between


【解决方案1】:

我想你会发现 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') ) 来获取您的 between 语句中使用的日、月和年。

【讨论】:

【解决方案2】:

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

【讨论】:

  • 测试失败:GROUP BY datedate 值对行进行分组,因此MAX(date)date 值,HAVING 子句对于每个分组的行集是true。请注意,HAVING 不需要 GROUP BY
【解决方案3】:

这是HAVING 的行为。

HAVINGgroup 导致您的第一个查询,因为HAVING 子句中有一个分组函数MAX所有返回的行将被分组到一个行组,因为没有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);

不知道哪个最快……

【讨论】:

  • 谢谢大家!现在我把 GROUP BY 放在 HAVING 之前,就像魅力一样。我知道的一个菜鸟错误......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-31
  • 1970-01-01
相关资源
最近更新 更多