我最近负责在开发人员上周退出时完成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
答案 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分钟或更短时间。