2010-06-06 8 views
2

Comment puis-je insérer toutes les dates dans une année (ou plus) dans une table à l'aide sqlinsérer un grand nombre de dates

Ma table dates a la structure suivante

dates(date1 date);

Supposons que je veux insérer dates comprises entre "2009-01-01" et "2010-12-31" inclusivement.

Y at-il une requête SQL pour ce qui précède?

+0

Pouvez-vous utiliser un langage de script? Cela pourrait rendre les choses plus faciles. –

+0

J'utilise php ... – Radhe

+0

peut-être que vous devriez utiliser un curseur? sélectionnez votre première date dans la première boucle, puis dateadd (1, d, date) chaque interaction lors de l'insertion ... http://ekdd.co.il/loop-though-each-query-results/ – eugeneK

Répondre

1

Eh bien, vous peut faire une simple boucle:

$start = mktime(12,0,0,1,1,2009); 
$end = mktime(15,0,0,12,31,2009); 

$values = array(); 
for($time = $start; $time <= $end; $time += 86400) { 
    $values[] = date('Y-m-d', $time); 
} 

$query = "INSERT INTO dates(`date`) VALUES ('".implode("'), ('", $values)."')"; 

mysql_query($query); 
2

Dates on a table

Dates sur une table!

Sérieusement, je ne sais pas pure façon de le faire mySQL

En PHP (mais serait intéressant de voir s'il y en a un.):

$start_timestamp = strtotime("2009-01-01 00:00:00"); 
$end_timestamp = strtotime("2009-12-31 23:59:59"); 

// $interval can be anything strtotime() can handle, 2 days, 1 week, 6 hours... 
$interval =  "1 day"; 

$timestamp = $start_timestamp; 

while ($timestamp < $end_timestamp) 
{ 
    $query = "INSERT INTO tablename (date_column)". 
      " VALUES (".date("Y-m-d", $timestamp).");"; 
    echo $query."<br>"; 
    // execute query here.... 
    $timestamp = strtotime("+ ".$interval, $timestamp); 
    } 
+0

où est la variable '$ end' provenant de la boucle while? – Sarfraz

+0

Cheers @Sarfraz, a oublié d'ajouter '_timestamp' là. Corrigée. –

+0

Et personne ne pense au modèle relationnel qui dit de stocker uniquement les données réelles, pas les feuilles vides. –

7

une solution pure mysql en utilisant une procédure stockée et répéter jusqu'à:

delimiter // 

CREATE PROCEDURE insert_many_dates(number_to_insert INT) 
BEGIN 
    SET @x = 0; 
    SET @date = '2010-01-01'; 
    REPEAT 
     SET @x = @x+1; 
     INSERT INTO your_table(your_column) VALUES(@date); 
     SET @date = DATE_ADD(@date, INTERVAL 1 day); 
    UNTIL @x > number_to_insert END REPEAT; 
END 
// 
delimiter ; 

Appel par

CALL insert_many_dates(1000); 
+2

+1 très bien! ------------- –

+0

Probablement plus utile écrit avec deux paramètres pour la date de début et la date d'arrêt. OU demandez-lui de ramasser la dernière date dans le tableau des dates et de partir de là, peut-être. – jmucchiello

0

Je sais que d'une requête simple qui fonctionne pour Oracle, mais je ne sais pas si cela va fonctionner sur mySQL

insert into DATES_TABLE (
     select sysdate+level-1 as a_date 
     from dual 
     connect by level <= 365) 

Il suffit de remplacer sysdate un argument qui contient la date à partir de laquelle vous souhaitez commencer et remplacez 365 par le nombre de jours que vous souhaitez afficher.

Espérons que cela aide. Je n'ai pas testé sa performance à fond, mais ça devrait être très rapide.

0

La façon pure MYSQL de le faire est:

select * from (
select date('2009-01-01') + interval (@count := @count + 1)-1 day d 
from (select @count := 0) count 
cross join (select 1 union all select 1) as two 
cross join (select 1 union all select 1) as four 
cross join (select 1 union all select 1) as eight 
cross join (select 1 union all select 1) as sixteen 
cross join (select 1 union all select 1) as thirty_two 
cross join (select 1 union all select 1) as sixty_four 
cross join (select 1 union all select 1) as one_two_eight 
cross join (select 1 union all select 1) as two_five_six 
cross join (select 1 union all select 1) as five_twelve 
cross join (select 1 union all select 1) as one_thousand_twenty_four) d 
where d between '2009-01-01' and '2010-12-31'; 

et son super rapide aussi!

Questions connexes