Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按15分钟的间隔对mysql查询进行分组_Mysql_Sql_Datetime_Group By_Timestamp - Fatal编程技术网

按15分钟的间隔对mysql查询进行分组

按15分钟的间隔对mysql查询进行分组,mysql,sql,datetime,group-by,timestamp,Mysql,Sql,Datetime,Group By,Timestamp,我有一个监控系统,每n秒收集一次数据(n约为10,但有所不同)。我想每隔15分钟收集一次数据。是否有办法将时间戳值合并为15分钟的数据块,以便分组工作?下面方法1)的改编: SELECT FLOOR(UNIX_TIMESTAMP(timestamp)/(15 * 60)) AS timekey FROM table GROUP BY timekey; 调整方法3)如下: 我发现了一些方法: (一) (二) (三) (这里也有:) 编辑:所有的解决方案在一个有大量记录的表上都会表现不

我有一个监控系统,每n秒收集一次数据(n约为10,但有所不同)。我想每隔15分钟收集一次数据。是否有办法将时间戳值合并为15分钟的数据块,以便分组工作?

下面方法1)的改编:

SELECT   FLOOR(UNIX_TIMESTAMP(timestamp)/(15 * 60)) AS timekey
FROM     table
GROUP BY timekey;
调整方法3)如下:

我发现了一些方法:

(一)

(二)

(三)

(这里也有:)


编辑:所有的解决方案在一个有大量记录的表上都会表现不佳。

试试这个,按15分钟的间隔分组记录,您可以在几秒钟内将15*60更改为所需的间隔

SELECT sec_to_time(time_to_sec(datefield)- time_to_sec(datefield)%(15*60)) as intervals from tablename
group by intervals
这对我有用

mysql> **SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(NOW())- UNIX_TIMESTAMP(NOW())%(15*60));**
+---------------------------------------------------------------------+
| FROM_UNIXTIME(UNIX_TIMESTAMP(NOW())- UNIX_TIMESTAMP(NOW())%(15*60)) |
+---------------------------------------------------------------------+
| 2012-02-09 11:15:00                                                 |
+---------------------------------------------------------------------+
1 row in set (0.00 sec)

我从unutbu上面给出的答案开始,但没有得到我所需要的,我不得不补充一点

Created,from_unixtime(FLOOR(UNIX_TIMESTAMP(Created)/(15*60))*(15*60))GroupTime,
将(*)计数为Cnt
从第一期开始
分组时间


该代码在15分钟的时间跨度内除以900秒,然后将该值降到最低,并将其乘以900,基本上四舍五入到最接近的15分钟增量

以下查询按15分钟的间隔对行进行分组并创建时间戳

Select concat( date(created_dt) , ' ', sec_to_time(time_to_sec(created_dt)- time_to_sec(created_dt)%(15*60) + (15*60)))as created_dt_new from table_name group by created_dt_new 

例如时间戳
2016-11-09 13:16:29
2016-11-09 13:16:49
2016-11-09 13:17:06
2016-11-09 13:17:26
2016-11-09 13:18:24
2016-11-09 13:19:59
2016-11-09 13:21:17

分为2016-11-09 13:30:00

  • sec-to-time(time-to-sec(created-dt)-time-to-sec(created-dt)%(15*60)+(15*60))

    最接近15分钟间隔的上限时间。e、 g 12:10->12:15

  • concat(日期(创建时间),'',秒到秒时间(时间到秒(创建时间)-时间到秒(创建时间)%(15*60)+(15*60))

    根据时间戳字段中的日期生成时间戳


  • Unix时间戳:使用以下方法之一将时间戳设置为最接近15分钟:

    timestamp div (15 * 60) * (15 * 60) -- div is integer division operator
    timestamp - timestamp % (15 * 60)
    
    日期-时间:假设数据类型没有小数秒,请使用以下命令将其限定为最接近的15分钟:

    date - INTERVAL EXTRACT(SECOND FROM date) SECOND - INTERVAL EXTRACT(MINUTE FROM date) % 15 MINUTE
    
    这是我的工作

    SELECT CONCAT (
            YEAR(transactionDate)
            ,'-'
            ,MONTH(transactionDate)
            ,'-'
            ,DAYOFMONTH(transactionDate)
            ,' '
            ,HOUR(transactionDate)
            ,':'
            ,((floor((MINUTE(transactionDate) / 15)) + 1) * 15) - 1
            ,':59'
            ) AS tmp1
        ,count(*)
    FROM tablename
    GROUP BY tmp1 limit 20;
    
    将“15”更改为您想要的任何间隔

    选择计数(*),
    CONCAT(小时(列日期),“:”,(分钟(创建日期)div 15)*15)作为日期
    从表名
    按日期分组
    由COLU date ASC订购;
    
    我对分组不满意

    SELECT   datetime
    FROM     table
    WHERE MOD(MINUTE(TIME(datetime)),15) = 0 AND SECOND(TIME(datetime)) = 0;
    

    它不应该是
    UNIX\u TIMESTAMP(TIMESTAMP)/(15*60)
    分钟吗?我认为这里不应该使用ROUND函数。DIV更合适
    UNIX\u TIMESTAMP(TIMESTAMP)DIV(15*60)
    因为选择ROUND(1.8),ROUND(2.1)将落在同一段中,尽管它们不应该落在同一段中。Ref:
    ROUND
    给出的15分钟间隔与
    DIV
    不同,但两者都产生15分钟的间隔。我认为使用FLOOR会比ROUND函数产生更好的结果:00:00:00将与00:14:59之前的值分组。我认为这是一个更自然的概念。我会使用CEIL。如果你使用10分钟的间隔,那么FLOOR会给出5,15,25,而ceil会给出0,10,20,这是更正确的分割方式。那么,你会如何调整这些间隔以适应15分钟的分组范围?与~unutbu的方法相同。但是他跑得更快:-)我最喜欢这种方法,因为它将分钟间隔作为我的专栏之一,使它更具可读性。谢谢。这也帮了我的忙!谢谢需要它几个小时,所以我将(15*60)改为(60*60)。如果记录包含多个日期,这将不起作用,因为所有跨日期具有相同时间的记录都被分组。@BenG:非常感谢。这只是给了我我需要的结果。
    Select concat( date(created_dt) , ' ', sec_to_time(time_to_sec(created_dt)- time_to_sec(created_dt)%(15*60) + (15*60)))as created_dt_new from table_name group by created_dt_new 
    
    timestamp div (15 * 60) * (15 * 60) -- div is integer division operator
    timestamp - timestamp % (15 * 60)
    
    date - INTERVAL EXTRACT(SECOND FROM date) SECOND - INTERVAL EXTRACT(MINUTE FROM date) % 15 MINUTE
    
    SELECT CONCAT (
            YEAR(transactionDate)
            ,'-'
            ,MONTH(transactionDate)
            ,'-'
            ,DAYOFMONTH(transactionDate)
            ,' '
            ,HOUR(transactionDate)
            ,':'
            ,((floor((MINUTE(transactionDate) / 15)) + 1) * 15) - 1
            ,':59'
            ) AS tmp1
        ,count(*)
    FROM tablename
    GROUP BY tmp1 limit 20;
    
    SELECT   datetime
    FROM     table
    WHERE MOD(MINUTE(TIME(datetime)),15) = 0 AND SECOND(TIME(datetime)) = 0;