2016-09-06 157 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