分表规则为:每月分两张表.1-15号为 table_prefix_Ym_1 ,16-31号为table_prefix_Ym_2 , 如:table_prefix_201903_1
<?php /** * @purpose: 根据时间范围获取表名 * @explain: 表名的分表规则是,每月分两张表,1-15号为 table_prefix_Ym_1 ,16-31号为table_prefix_2 , 如:table_prefix_201903_1 * User: Chrdai * Date: 2019/3/5 * Time: 18:08 */ class TablePrefix { /** * @const app调用记录表前缀 */ const PREFIX= ‘table_prefix_‘; /** * @purpose:获取指定时间范围内的app调用记录表 * @param int|string $starttime 开始时间 * @param int|string $endtime 结束时间 * @return array $tables 指定时间范围内的应用程序记录表 */ public static function getTableByDateRange($starttime,$endtime) { $tables = []; if(!empty($starttime)){ $start = is_numeric($starttime) ? date(‘Ymd‘,$starttime) : date(‘Ymd‘,strtotime($starttime)); } if(!empty($endtime)){ $end = is_numeric($endtime) ? date(‘Ymd‘,$endtime) : date(‘Ymd‘,strtotime($endtime)); } if(!empty($start) && !empty($end)){ $prev = floor($start / 100); $next = floor($end / 100); //开始时间小于等于结束时间范围内的表都房间$tables while ($prev <= $next){ $tables[] = self::PREFIX . $prev. ‘_1‘; $tables[] = self::PREFIX . $prev. ‘_2‘; $prev = ($prev % 100 === 12) ? ((floor($prev/100) + 1) * 100 +1) : $prev + 1; //对夸年的月份做特殊处理 } //以15天为分界线,分上下月,去除重复的表 if($start % 100 > 15){ array_shift($tables); } if($end % 100 <= 15){ array_pop($tables); } } return $tables; } }
//获取表名 $tables = TablePrefix::getTableByDateRange(‘2019-03-05 12:00:00‘,‘2019-03-05 14:00:00‘); //循环处理各个表中的数据 $table = array_shift($tables); // 首先拿出第一张表中的数据 while(true){ __loop: //...... (每张表的业务逻辑) // 如果$tables中没有表了,则跳出循环,否则循环处理 if(empty($tables)){ break; }else{ $table = array_shift($tables); goto __loop; } }
`
原文地址:https://www.cnblogs.com/chrdai/p/10551175.html
时间: 2024-10-10 15:28:52