2 Stimmen

Einfügen einer großen Anzahl von Daten

Wie kann ich alle Daten in einem Jahr (oder mehr) in eine Tabelle mit Sql einfügen?

Meine dates Die Tabelle hat folgende Struktur

dates(date1 date);

Angenommen, ich möchte Daten zwischen "2009-01-01" a "2010-12-31" inklusive.

Gibt es eine Sql-Abfrage für die oben genannten?

7voto

Richard Harrison Punkte 18867

Eine reine Mysql-Lösung mit einer gespeicherten Prozedur und REPEAT UNTIL:

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 ;

Rufen Sie es mit

CALL insert_many_dates(1000);

2voto

Pekka Punkte 429407

Dates on a table

Datteln auf einem Tisch!

Im Ernst, ich kenne keine reine mySQL-Methode, um dies zu tun (aber wäre daran interessiert, zu sehen, ob es eine gibt).

In PHP:

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

1voto

Tatu Ulmanen Punkte 119424

Nun, Sie können eine einfache Schleife machen:

$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);

0voto

RonK Punkte 9156

Ich kenne eine einfache Abfrage, die für Oracle funktioniert, aber ich habe keine Ahnung, ob sie auch für mySQL funktioniert

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

Einfach ersetzen **sysdate** mit einem Argument, das das Datum enthält, mit dem Sie beginnen möchten, und ersetzen Sie **365** mit der Anzahl der Tage, auf die Sie sich freuen möchten.

Ich hoffe, das hilft. Ich habe seine Leistung nicht gründlich getestet, aber es sollte sehr schnell sein.

0voto

roblovelock Punkte 1861

Der reine MYSQL-Weg, dies zu tun, ist:

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';

und das auch noch superschnell!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X