根据时间范围获取表名(table_prefix)

Posted chrdai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了根据时间范围获取表名(table_prefix)相关的知识,希望对你有一定的参考价值。

 

分表规则为:
每月分两张表.

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)的主要内容,如果未能解决你的问题,请参考以下文章

Mssql根据表名获取字段

Oracle中根据时间范围查询数据

mysql获取外键, 根据数据库名和表名获取表所对应的所有外键

SQL语句获取日期的月份

根据到达日期值限制出发日期的日期范围[重复]

如何从 SqlDataReader 获取列的表名