簡體   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