根據時間範圍獲取表名(table_prefix)
阿新 • • 發佈:2019-03-18
兩張 hrd amp 跳出循環 業務 rpo stat elf 16px
分表規則為:
每月分兩張表.
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;
}
}
`
根據時間範圍獲取表名(table_prefix)