插入大量日期

时间:2010-06-06 09:20:06

标签: php sql mysql

如何使用sql

在一年中(或更多)插入一年中的所有日期

我的dates表格具有以下结构

dates(date1 date);

假设我想在"2009-01-01""2010-12-31"之间插入日期。

上面是否有任何sql查询?

5 个答案:

答案 0 :(得分:7)

使用存储过程和REPEAT UNTIL的纯mysql解决方案:

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 ;

通过

调用它
CALL insert_many_dates(1000);

答案 1 :(得分:2)

Dates on a table

桌上的日期!

说真的,我不知道一种纯粹的mySQL方法(但是有兴趣看看是否有一种方法。)

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

答案 2 :(得分:1)

好吧,你可以做一个简单的循环:

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

答案 3 :(得分:0)

我知道一个适用于Oracle的简单查询,但我不知道它是否适用于mySQL

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

只需将sysdate替换为包含您要开始的日期的参数,并将365替换为您希望展望的天数。

希望这会有所帮助。我没有彻底测试它的性能,但它应该非常快。

答案 4 :(得分:0)

纯粹的MYSQL方式是:

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

它的超快速!