2013-03-11 2 views
1

J'ai une base de données Mysql avec une table pour chaque jour, il va dans ce sens: my_table_20130310, my_table_20130311 ...Faites un SELECT sur toutes les tables entre 2 dates

Je veux faire une sélection sur toutes les tables, disons entre « 02.02.2013 » et « 28/03/2013 »

Il y a cette solution stupide qui consiste à transformer les dates données dans ce:

'2013/02/02' => 20130202 

'2013/03/28' => 20130328 

ensuite coulé dans (int) et faire une boucle:

 $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 ; 
     ... 
     ... 
     } 

Mais ce n'est pas une solution car il va essayer d'analyser tous les nombres entre 20130202 et 20130328 (20130299, 20130245 ....)

Une idée?

gars Thx

+0

attente. Pourquoi voulez-vous avoir une table pour chaque jour? ne correspond pas au sens. Vous pouvez toujours utiliser GROUP BY pour regrouper les données par jour. – Raptor

+3

Je pense que la racine du problème est que vous avez une table pour chaque jour. Si vous pouvez changer le schéma pour faire du jour une colonne (indexée et éventuellement partie de la clé), vos problèmes devraient disparaître. –

+0

Pourquoi avez-vous des tables séparées pour les données quotidiennes, pourquoi ne pas simplement ajouter une colonne pour la date? Ça a l'air un peu ... bizarre. –

Répondre

1

Essayez ceci:

$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 
} 
+1

Thx beaucoup, ne savais pas que nous pourrions le faire de cette façon! – Alucard

2

En pseudocode:

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'); 
    //... 
} 
+0

Vous devez changer la fonction appel opérateur de "." à "->" (mais c'est juste un détail!) Je pense que le format serait aussi (Ymd). Merci beaucoup. – Alucard

+0

@vladimire Oui, comme je l'ai dit c'est du pseudo-code. Espérons assez pour vous donner l'idée de l'algorithme. –

Questions connexes