如何使用sql
在一年中(或更多)插入一年中的所有日期我的dates
表格具有以下结构
dates(date1 date);
假设我想在"2009-01-01"
到"2010-12-31"
之间插入日期。
上面是否有任何sql查询?
答案 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)
桌上的日期!
说真的,我不知道一种纯粹的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';
它的超快速!