2016-09-06 190 views
0

以下MySQL查詢提供的記錄有時是:08:00:00, 09:00:00, 12:00:00, 15:00:00 etc(可按3整除,如group by所指定的),但我希望記錄時間08:00:00, 11:00:00, 14:00:00, 17:00:00 etc.,即從我給定的開始時間開始的時間間隔。我怎樣才能做到這一點?MySql查詢兩個日期時間範圍之間的每個時間間隔的記錄

SELECT * 
FROM `data_10082016` 
WHERE CREATED_AT BETWEEN "2016-08-11 08:00:00" AND "2016-08-15 08:00:00" 
GROUP BY DATE(DATETIME) , FLOOR(HOUR(DATETIME) /3) 
ORDER BY `data_10082016`.`id` ASC 
+2

此問題中的查詢不保證返回組中的任何特定行;返回的值將來自組中的某個(不確定)行。請注意,此問題中的查詢依賴於GROUP BY的MySQL擴展。其他的RDBMS會拋出一個關於「不在SELECT列表中而不在GROUP BY中」的錯誤。 (通過在sql_mode變量中包含ONLY_FULL_GROUP_BY,我們可以使MySQL以更標準的方式運行。)要從特定行中獲取值,需要WHERE子句中的附加謂詞或SELECT列表中的某些巧妙表達式。 – spencer7593

+0

Thanls @ spencer7593,我現在正在學習MySQL ...聚合像??實際上,我需要像12:00:25,12:01:23,11:59:42 ...這樣的最接近小時的行... – nik

+1

SUM(),MAX(),MIN(),AVG()一組行以返回單個值。通過GROUP BY操作,可能會將多行摺疊爲單行。對GROUP BY的MySQL擴展將允許在SELECT列表中使用非聚合表達式(例如,普通列)。 MySQL將從組中的某一行返回一個值。無法保證價值最低或最高,或者來自最早,最近,最新的一排。這就是我們說價值是「不確定」的意思 – spencer7593

回答

0

你只需要添加一個偏移量(+2,-7,...)你floor(...)功能,例如

... 
group by date(created_at), floor(hour(created_at)/3) + 2 
... 
+0

謝謝,@Olaf,它給予'08:00:00,10:00,13:00:00等'嘗試偏移'1'並得到結果,但不完全即ie偏移'1',這些是我得到的時間:'08,11,14,17,20,23,00',02,05' ...即這裏'00'在這裏是不需要的.. – nik

+0

爲什麼我在這裏得到'00'嗎? – nik

+0

也許試試'floor(hour(created_at)/ 3)+ 2'。儘管從評論中,可能我誤解了你想達到的目標。 –

1

假設你想對應於這些時間,而不是在這些時間之間的間隔總合量度記錄....

SELECT * 
FROM `data_10082016` 
WHERE CREATED_AT BETWEEN "2016-08-11 08:00:00" AND "2016-08-15 08:00:00" 
AND MOD(HOUR(DATETIME)+8, 3) = 0 
ORDER BY `data_10082016`.`id` ASC 

會給你的記錄在上午8點間隔3小時。

取得記錄最接近到一小時是一個很大的困難,將需要一個參考表。沒有什麼可以用SQL和大量的專業知識來嘗試。

+0

謝謝@symcbean,我認爲它應該像'MOD(HOUR(DATETIME)-8,3)= 0' ...隨着你的查詢,我得到的時間是:'10,13,16,19 .. ' 然而,只有'WHERE條件'它不會給我最接近小時的記錄,例如12:00:25,12:01:23,11:59:42最接近12:00:00。 ..而是我得到的是所有記錄與給定的小時(如「08」是小時,所有記錄與小時'08'獲得像'08:01:33','08:02:33'等),因爲我們只是在'WHERE'部分評估小時數...... – nik

+0

是的,你們對這兩方面都是正確的 - 即使是在一小時內獲得記錄也不是微不足道的。加上'AND 0 = MINUTE(datetime)'應該正好在一小時的時間 - 但這不是你想要的。 – symcbean

+0

是的,這不完全是我想...我想要最接近的一個可能...另外,通過分組,如果某些行具有相同的時間,那麼這些全部被摺疊成一個,如@ spencer7593在註釋問題,我想要的是,所有的行(即使在同一時間)和最接近小時的...此外,我試圖添加'MINUTE = 0'條件,但事實是,我很少有可能找到記錄完全在'00'分鐘,因此'MINUTE = 0'的結果幾乎是我想要的一半... – nik