Php 插入大量日期
如何使用sql在表中插入一年或一年以上的所有日期 “我的日期”表具有以下结构 日期日期日期1 假设我想插入2009-01-01到2010-12-31(包括2009-01-01和2010-12-31)之间的日期 是否有针对上述内容的sql查询 桌子上的日期 不过,说真的,我不知道一种纯mySQL的方法可以做到这一点,但我很想看看是否有这种方法 在PHP中:Php 插入大量日期,php,sql,mysql,Php,Sql,Mysql,如何使用sql在表中插入一年或一年以上的所有日期 “我的日期”表具有以下结构 日期日期日期1 假设我想插入2009-01-01到2010-12-31(包括2009-01-01和2010-12-31)之间的日期 是否有针对上述内容的sql查询 桌子上的日期 不过,说真的,我不知道一种纯mySQL的方法可以做到这一点,但我很想看看是否有这种方法 在PHP中: $start_timestamp = strtotime("2009-01-01 00:00:00"); $end_timestamp =
$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);
}
你可以做一个简单的循环:
$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);
使用存储过程的纯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);
我知道一个简单的查询适用于Oracle,但我不知道它是否适用于mySQL
insert into DATES_TABLE (
select sysdate+level-1 as a_date
from dual
connect by level <= 365)
只需将sysdate替换为包含您希望开始日期的参数,并将365替换为您希望的预期天数
希望这有帮助。我没有彻底测试它的性能,但它应该非常快 实现这一点的纯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';
而且它的速度也非常快 你能使用任何脚本语言吗?这可能会让事情变得更简单。也许你应该用光标?在第一个循环中选择您的第一个日期,然后在插入时选择dateadd1,d,date每个交互的日期@EudeneK:你不认为这和一个简单的php脚本相比会很乏味吗?你要求对上面的内容进行sql查询。游标很容易编写,如果您打算偶尔使用它,它应该是个问题。while循环中的$end变量来自哪里?Cheers@Sarfraz,忘记在那里添加_时间戳了。更正。没有人想到关系模型说只存储实际数据,而不是空表。@Col正确和良好的观点,但OP提供的信息太少,无法说明这里正在计划什么。这可能是做OP必须做的事情的正确方式。但是,它也可能不是。如果使用两个参数来编写“开始日期”和“停止日期”,可能会更有用。或者让它选择dates表中的最后一个日期并从那里开始,也许。