MySQL拆分时间范围缩小到更小的块

时间:2010-12-21 17:31:46

标签: php mysql time

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

坚果壳中的问题:
我有一个MySQL表,其中包含开始和结束日期时间(GMT -5)& UNIX时间戳值覆盖不规则长度的持续时间,需要将它们分解/拆分/分成更常规的时间块(5分钟)。我不是在每次chunk / bucket / period的行条目计数之后,如果这有意义的话。

数据示例:

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查询,其中插入修改时间戳(结束)。

我的雇主最近将定期报告计量单位从 Seconds“On”每天更改为 Seconds“On”每5分钟间隔。我已经制定了我认为可行的解决方案,但是当我在纸上看到它时,看起来Rube Goldberg的噩梦是用MySQL构建的,所以这就好了。

有关如何将这些跨度划分为5分钟块的任何建议?尽管我会采用任何建议,但在MySQL中保留这一切都是我的首选。感谢您提出的任何建议。

再次,如果这是一个明智的话,我道歉 如果我在将来询问有关SO集体意识的任何其他问题,我会尝试更好地说出它们。欢迎任何帮助。

谢谢,
Neren

2 个答案:

答案 0 :(得分:1)

不是试图转换原始数据,而是密集地表示,而是编写一个检索模块,该模块读取原始数据并在内部将其转换为所需的表示形式。我想它可以把它写回一个新表,但有没有理由不能直接从程序中生成报告?

答案 1 :(得分:0)

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

在您的数据库中创建一个名为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分钟或更短时间。