组日期时间范围

时间:2015-05-12 07:21:48

标签: mysql datetime group-by

我在分组某些数据集时遇到了一些麻烦。这是我的查询和查询结果。

SELECT COUNT(*),salarie_id, created_at
FROM enregistrement 
GROUP BY salarie_id, created_at

我的观点是将相似的created_at行分组,间隔为+/- 3秒。在INTERVAL这样的标准中,即使使用HAVING,我也无法管理它 ,WHERE ... BETWEEN

如何对这些行进行分组,例如我的计数结果为36(33 + 3),如图所示?

没有找到合适的解决方案......如果您想了解更多信息,请与我们联系。

更新1:看起来@fancypants解决方案正确。

SELECT COUNT(*),salarie_id, DATE_FORMAT(created_at, CONCAT('%Y-%m-%d %H:%i:', LEFT(RIGHT(created_at, 2), 1), RIGHT(created_at, 1) % 3)) AS 'date'
FROM enregistrement 
GROUP BY salarie_id, DATE_FORMAT(created_at, CONCAT('%Y-%m-%d %H:%i:', LEFT(RIGHT(created_at, 2), 1), RIGHT(created_at, 1) % 3))

2 个答案:

答案 0 :(得分:1)

SELECT COUNT(*),salarie_id, created_at
FROM enregistrement 
GROUP BY salarie_id, 
DATE_FORMAT(created_at, CONCAT('%Y-%m-%d %H:%i:', LEFT(RIGHT(created_at, 2), 1), 
CASE WHEN RIGHT(created_at, 1) BETWEEN 1 AND 4 THEN 0
WHEN RIGHT(created_at, 1) BETWEEN 5 AND 7 THEN 1
ELSE 2 END
));

您可以使用DATE_FORMAT()将日期时间/时间戳列添加到特定形状中。 在您的情况下,我们使用

指定格式
CONCAT('%Y-%m-%d %H:%i:', LEFT(RIGHT(created_at, 2), 1), RIGHT(created_at, 1) % 3))

也就是说,我们采用年,月,日,小时,分钟。然后我们将日期格式字符串连接到十秒的幂。

例如,你有这个秒:

21
33
36
40

然后我们用LEFT(RIGHT(created_at, 2), 1)取2,3,3和4。我们使用RIGHT(created_at, 1)获得1,3,6和0。然后你只需要将它们放入CASE WHEN的自定义组中。

答案 1 :(得分:0)

您需要在选择中创建列,然后您可以按此列进行分组。这是一个例子:

SELECT 
    COUNT(*),
    salarie_id, 
    IF(created_at BETWEEN "2014-10-01 00:00:00" AND "2014-10-01 00:00:00", "2014-10-01 00:00:00"
    ELSEIF(created_at BETWEEN "2015-02-18 11:05:43" AND "2015-02-18 11:05:46", "2015-02-18 11:05:43",
    ELSEIF( ...
    ))) as buckets
FROM enregistrement 
GROUP BY salarie_id, bucket

我不确定在你的情况下这可能是多么实际,因为你可能事先不知道间隔。

在您的示例中,简单的方法是简单地按日期和时间分组,而不是秒:

SELECT
  DATE_FORMAT(created_at,"%Y-%m-%d %H:%i") as short_date
  .....
GROUP BY salarie_id, short_date