【问题标题】:MySQL Split Time Ranges into Smaller ChunksMySQL 将时间范围拆分为更小的块
【发布时间】:2010-12-21 17:31:45
【问题描述】:

上周开发人员退出时,我最近的任务是完成一个 PHP/MySQL Web 应用程序。我不是 MySQL 专家,所以如果这是一个非常简单的问题,我深表歉意。我已经搜索了两天的大部分时间,试图找到一个相对简单的解决方案来解决我的问题,如下所示。

问题简述:
我有一个 MySQL 表,其中包含开始和结束日期时间 (GMT -5) 和 UNIX 时间戳值,涵盖不规则长度的持续时间,需要将它们分解/拆分/划分为更规则的时间块(5 分钟)。我不是在计算每个时间块/桶/周期的行条目数,如果这有任何意义的话。

数据示例:

started, ended, started_UNIX, ended_UNIX  
2010-10-25 15:12:33, 2010-10-25 15:47:09, 1288033953, 1288036029  

我希望得到什么:

2010-10-25 15:12:33, 2010-10-25 15:15:00, 1288033953, 1288037700  
2010-10-25 15:15:00, 2010-10-25 15:20:00, 1288037700, 1288038000  
2010-10-25 15:20:00, 2010-10-25 15:25:00, 1288038000, 1288038300  
2010-10-25 15:25:00, 2010-10-25 15:30:00, 1288038300, 1288038600  
2010-10-25 15:30:00, 2010-10-25 15:35:00, 1288038600, 1288038900  
2010-10-25 15:35:00, 2010-10-25 15:40:00, 1288038900, 1288039200  
2010-10-25 15:40:00, 2010-10-25 15:45:00, 1288039200, 1288039500  
2010-10-25 15:45:00, 2010-10-25 15:47:09, 1288039500, 1288039629  

如果您有兴趣,这里是应用程序的快速和肮脏以及我需要数据的原因:
应用程序概述:应用程序在其输入引脚接地时接收由基本传感器设备生成的非常简单的 POST 请求,该请求向 MySQL 记录时间戳(如启动时)的数据库提交 INSERT 查询。当输入引脚从接地状态返回时,设备会提交不同的 POST 请求,这会导致 PHP 应用程序提交 UPDATE 查询,其中会插入修改时间时间戳(结束时)。

我的雇主最近将定期报告的计量单位从每天“开启”秒​​m>更改为每 5 分钟间隔“开启”秒​​m>。我已经制定了我认为可行的解决方案,但是当我在纸上查看它时,它看起来就像是在 MySQL 中构建的 Rube Goldberg 的噩梦,所以它被淘汰了。

关于如何将这些跨度分成 5 分钟的块有什么建议吗?将其全部保存在 MySQL 中是我的偏好,尽管我会接受任何 建议。感谢您提出的任何建议。

再次,如果这是一个简单的问题,我深表歉意。
如果我以后再问关于 SO 集体意识的任何其他问题,我会尽量用词更好一些。任何帮助都将受到欢迎。

谢谢,
尼人

【问题讨论】:

  • 这没有意义。如果您试图计算每 5 分钟的秒数,那么您列出的所需数据对实现该目标并没有多大帮助。如果它停留在两个时期会发生什么......从 10:04 开始并在 10:06 结束?你不能只在 mysql 中做到这一点。

标签: php mysql time


【解决方案1】:

与其尝试转换表示良好且密集的原始数据,不如编写一个检索模块,该模块读取原始数据并在内部将其转换为所需的表示。我想它可以将它写回一个新表,但是有什么理由不能直接从程序生成报告?

【讨论】:

    【解决方案2】:

    这类似于“空白行”问题,如果您确实必须更改数据,可以使用数字表来解决。

    在您的数据库中创建一个名为 numbers 的表并插入数字 0 到 9:

    CREATE TABLE  numbers (
       num int(10) unsigned NOT NULL,
       PRIMARY KEY (num)
     ); 
    

    数字表可用于制作可以转换为时间的整数序列。例如,要获取从 15:15 到 15:45 的序列:

       SELECT ADDDATE('2010-10-25 15:15:00', INTERVAL 5*`i` MINUTE) FROM (
           SELECT 10*n1.num + n2.num AS i
            FROM numbers n1 CROSS JOIN numbers n2) nums
         WHERE i <= TIME_TO_SEC(TIMEDIFF('15:45', '15:15'))/(5*60)
         ORDER BY i ASC;
    

    分两步制作数据。首先,创建缺失的行。然后将原始行更新为 5 分钟或更短。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-19
      • 1970-01-01
      • 2011-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多