public function partion($format = 'ymd')
{
$this->_initPts = 36;
$table = 'level';
$field = 'ymd';
$begin = '2016-12-31';
if($format == 'ymd')
{
//$this->_initPts = 41;
$sql = "ALTER TABLE `$table` PARTITION BY RANGE ($field) PARTITIONS " . ($this->_initPts+1) . ' ( ';
for($i = 0; $i <= $this->_initPts; ++$i)
{
// 起点
$next_str = $i ? strtotime('next month', $next_str) : strtotime(date($begin));
// 年
$y = date('y', $next_str);
// 月
$_m = date('m', $next_str);
if($_m - $m != 1 && $_m - $m != -11) // 在29号至31号时容易出错,会跳月
{
$next_str -= 24*3600*7; //减去7天,应该就可以退回上一个月了
// 年
$y = date('y', $next_str);
// 月
$m = date('m', $next_str);
}
else
{
$m = $_m;
}
// 下月的第一秒(也就是下个月1号的0:0:0)
$time = strtotime('next month', $next_str);
// "PARTITION p1703 VALUES LESS THAN (UNIX_TIMESTAMP('17-04-01 00:00:00')) COMMENT = '17年3月份充值表'
$sql .= "\n PARTITION p$y$m VALUES LESS THAN (" . date('ym01', $time) . ") COMMENT = '{$y}年{$m}月份',";
}
$sql = rtrim($sql, ',') . ');';
halt($sql);
}
$sql = "ALTER TABLE `$table` PARTITION BY RANGE ($field) PARTITIONS " . ($this->_initPts+1) . ' ( ';
for($i = 0; $i <= $this->_initPts; ++$i)
{
// 起点
$next_str = $i ? strtotime('next month', $next_str) : strtotime(date($begin));
// 年
$y = date('y', $next_str);
// 月
$_m = date('m', $next_str);
if($_m - $m != 1 && $_m - $m != -11) // 在29号至31号时容易出错,会跳月
{
$next_str -= 24*3600*7; //减去7天,应该就可以退回上一个月了
// 年
$y = date('y', $next_str);
// 月
$m = date('m', $next_str);
}
else
{
$m = $_m;
}
// 下月的第一秒(也就是下个月1号的0:0:0)
$time = strtotime('next month', $next_str);
// "PARTITION p1703 VALUES LESS THAN (UNIX_TIMESTAMP('17-04-01 00:00:00')) COMMENT = '17年3月份充值表'
$sql .= "\n PARTITION p$y$m VALUES LESS THAN (" . strtotime(date('y', $time) . '-' . date('m', $time) . '-01 0:0:0') . ") COMMENT = '{$y}年{$m}月份',";
}
$sql = rtrim($sql, ',') . ');';
halt($sql);
}