【问题标题】:Do a SELECT on all tables between 2 dates在 2 个日期之间的所有表上执行 SELECT
【发布时间】:2013-03-11 09:37:29
【问题描述】:

我有一个 Mysql 数据库,每天都有一个表,它是这样的:my_table_20130310my_table_20130311 ...

我想在所有表上进行选择,比如说在“2013/02/02”和“2013/03/28”之间

有一个愚蠢的解决方案,就是把给定的日期变成这样:

'2013/02/02' => 20130202

'2013/03/28' => 20130328

然后转换成 (int) 然后做一个循环:

      $dbStartDate  = str_replace('/', '', substr($startDate, 0, 10));
      $dbEndDate    = str_replace('/', '', substr($endDate, 0, 10));

      for ($tbDate = $dbStartDate; $tbDate <= $dbEndDate ; $tbDate++) { 
        $res = 'SELECT * FROM my_table_' . $tbDate ;
        ...
        ... 
      }

但这不是一个解决方案,因为它会尝试解析 20130202 和 20130328 之间的所有数字(20130299、20130245....)

一个想法?

谢谢大家

【问题讨论】:

  • 等等。为什么你想每天都有一张桌子?与意义不符。您可以随时使用GROUP BY 按天对数据进行分组。
  • 我认为问题的根源在于您每天都有一张桌子。如果您可以更改架构以使日期成为列(索引并可能是键的一部分),您的问题应该会消失。
  • 为什么你有单独的表来存储每日数据,为什么不添加一个日期列呢?看起来有点……奇怪。
  • 我正在处理的数据非常庞大(我正在编制索引...),所以每天一张表是更好的解决方案
  • 也许尝试将开始日期转换为 unix 时间,然后添加 86400 秒并转换回您的 YYYYMMDD 格式,添加到数组,并重复直到它等于结束日期,然后循环结果数组?

标签: php mysql loops datediff


【解决方案1】:

在伪代码中:

DateTime startDate = new DateTime('2013-02-02');
DateTime endDate = new DateTime('2013-03-08');

for(DateTime d = startDate; d <= endDate; d = d.Add(new DateInterval('P1D')))
{
    res = 'SELECT * FROM my_table_' . d.format('YYYYmmdd');
    //...
}

【讨论】:

  • 您可以将函数调用操作符从“.”更改为到“->”(但这只是一个细节!)我认为格式也将是(Ymd)。非常感谢。
  • @vladimire 是的,就像我说的那样,它是伪代码。希望足以让您了解算法。
【解决方案2】:

试试这个:

$dbStartDate = new DateTime('2013/02/02');
$dbEndDate = new DateTime('2013/03/28');
$diff = $dbEndDate->diff($dbStartDate)->days; // get the difference in N days


// just a loop :p
$currentDate = $dbStartDate;
for($i=0;$i<=$diff;$i++){
    $query = 'SELECT * FROM my_table_' . $currentDate->format('Ymd');
    date_add($currentDate, date_interval_create_from_date_string('1 day'));
    // echo $query."<br/>"; // for testing purposes
}

【讨论】:

  • 非常感谢,不知道我们可以这样做!
猜你喜欢
  • 2015-05-20
  • 1970-01-01
  • 1970-01-01
  • 2013-09-03
  • 1970-01-01
  • 2012-07-18
  • 2011-04-26
  • 2017-06-12
相关资源
最近更新 更多