Javascript 如何找到最接近6小时间隔的日期时间?

Javascript 如何找到最接近6小时间隔的日期时间?,javascript,php,mysql,time,group-by,Javascript,Php,Mysql,Time,Group By,我有数百万条记录的表格,其中包含了一天中在随机时间datetime存在的事物的数量。一天可能有100或1000条记录 我需要报告每天大约[00:00,06:00,12:00,18:00]存在多少东西。。。这意味着这些时间可能有记录,也可能没有记录,所以如果没有,我需要前后最接近的记录 我尝试了几种方法,但运行时对于生产环境不可行。一定有一个更有效的方法,我没有想到。这是我的一个尝试,但我也尝试使用联合查询,以及从PHP运行4个单独的查询。解决方案可以是MySQL、PHP或JS/JQuery中的任

我有数百万条记录的表格,其中包含了一天中在随机时间datetime存在的事物的数量。一天可能有100或1000条记录

我需要报告每天大约[00:00,06:00,12:00,18:00]存在多少东西。。。这意味着这些时间可能有记录,也可能没有记录,所以如果没有,我需要前后最接近的记录

我尝试了几种方法,但运行时对于生产环境不可行。一定有一个更有效的方法,我没有想到。这是我的一个尝试,但我也尝试使用联合查询,以及从PHP运行4个单独的查询。解决方案可以是MySQL、PHP或JS/JQuery中的任何一种

选择dt、SUM和thgs 从myTable 其中dt在按日期从myTable组中选择MINdt 或从myTable中选择日期\提交\添加、间隔6小时、间隔6小时中的dt 按日期分组\u SUBDATEDATE\u ADDdt,间隔6小时,间隔6小时 或从myTable中选择日期\提交\添加、间隔12小时、间隔12小时中的dt 按日期分组\u SUBDATEDATE\u ADDdt,间隔12小时,间隔12小时 或从myTable中选择日期\提交\添加、间隔18小时、间隔18小时中的dt 按日期分组\u SUBDATEDATE\u ADDdt,间隔18小时,间隔18小时 按dt分组 按dt订购
思考?

关于这个问题,我已经讲得很晚了,但当我向那些好奇在任何给定时间有多少学生在使用我们的学习门户的经理们展示操作统计数据时,我通常是这样解决类似问题的:

SELECT tmp.`id`, tmp.`start_at`, tmp.`until_at`, COUNT(DISTINCT ss.`id`) as `things`
  FROM `Status` ss INNER JOIN (SELECT (h*1000+t*100+u*10+v+1) as `id`,
                                      DATE_SUB(DATE_FORMAT(DATE_ADD(Now(), INTERVAL 1 DAY), '%Y-%m-%d 00:00:00'), INTERVAL ((h*1000+t*100+u*10+v+1) - 1) * 6 HOUR) as `start_at`,
                                      DATE_SUB(DATE_SUB(DATE_FORMAT(DATE_ADD(Now(), INTERVAL 1 DAY), '%Y-%m-%d 06:00:00'), INTERVAL ((h*1000+t*100+u*10+v+1) - 1) * 6 HOUR), INTERVAL 1 SECOND) as `until_at`
                                 FROM (SELECT 0 h UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) a,
                                      (SELECT 0 t UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) b,
                                      (SELECT 0 u UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) c,
                                      (SELECT 0 v UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) d
                                WHERE (h*1000+t*100+u*10+v+1) > 0) tmp ON ss.`event_at` BETWEEN tmp.`start_at` AND tmp.`until_at`
 WHERE ss.`event_at` >= DATE_FORMAT(DATE_SUB(Now(), INTERVAL 2 WEEK), '%Y-%m-%d 00:00:00')
 GROUP BY tmp.`id`, tmp.`start_at`, tmp.`until_at`
 ORDER BY tmp.`id`;
工作原理:

最嵌套的子查询生成1到10000之间的数字序列 此序列用于计算六小时的时间段(在本例中为六小时) 7年中大约有10000个6小时的周期 按开始时间和结束时间分组 在合理的时间范围内过滤 我在我的开发工作站上进行了测试,它有一个第四代Core i7和32GB RAM。在一个包含2700多万条记录的统计表上,查询仅用了不到30秒的时间返回数据

这是一个样本。。。这并不意味着除了显示上述SQL是cromulent之外的任何内容:

注意:开发框不包含当月的任何数据,因此存在差距

如果您不想显示零的时段,那么可以在之后过滤掉


如果您或其他任何人仍在寻找此类问题的解决方案,这可能会提供一些值得思考的问题。

很晚才回答这个问题,但当我向那些好奇在任何给定时间有多少学生在使用我们的学习门户网站的经理们展示运营统计数据时,我通常就是这样解决类似问题的:

SELECT tmp.`id`, tmp.`start_at`, tmp.`until_at`, COUNT(DISTINCT ss.`id`) as `things`
  FROM `Status` ss INNER JOIN (SELECT (h*1000+t*100+u*10+v+1) as `id`,
                                      DATE_SUB(DATE_FORMAT(DATE_ADD(Now(), INTERVAL 1 DAY), '%Y-%m-%d 00:00:00'), INTERVAL ((h*1000+t*100+u*10+v+1) - 1) * 6 HOUR) as `start_at`,
                                      DATE_SUB(DATE_SUB(DATE_FORMAT(DATE_ADD(Now(), INTERVAL 1 DAY), '%Y-%m-%d 06:00:00'), INTERVAL ((h*1000+t*100+u*10+v+1) - 1) * 6 HOUR), INTERVAL 1 SECOND) as `until_at`
                                 FROM (SELECT 0 h UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) a,
                                      (SELECT 0 t UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) b,
                                      (SELECT 0 u UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) c,
                                      (SELECT 0 v UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) d
                                WHERE (h*1000+t*100+u*10+v+1) > 0) tmp ON ss.`event_at` BETWEEN tmp.`start_at` AND tmp.`until_at`
 WHERE ss.`event_at` >= DATE_FORMAT(DATE_SUB(Now(), INTERVAL 2 WEEK), '%Y-%m-%d 00:00:00')
 GROUP BY tmp.`id`, tmp.`start_at`, tmp.`until_at`
 ORDER BY tmp.`id`;
工作原理:

最嵌套的子查询生成1到10000之间的数字序列 此序列用于计算六小时的时间段(在本例中为六小时) 7年中大约有10000个6小时的周期 按开始时间和结束时间分组 在合理的时间范围内过滤 我在我的开发工作站上进行了测试,它有一个第四代Core i7和32GB RAM。在一个包含2700多万条记录的统计表上,查询仅用了不到30秒的时间返回数据

这是一个样本。。。这并不意味着除了显示上述SQL是cromulent之外的任何内容:

注意:开发框不包含当月的任何数据,因此存在差距

如果您不想显示零的时段,那么可以在之后过滤掉

如果您或其他任何人仍在寻找此类问题的解决方案,这可能会提供一些思考