[英]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.