2010-06-06 4 views
2

Как я могу вставить все даты в год (или более) в таблице с помощью SQLвставляя большое количество дат

Моя dates таблица имеет следующую структуру

dates(date1 date);

Предположим, что я хочу, чтобы вставить даты между "2009-01-01" до "2010-12-31" включительно.

Есть ли какой-либо запрос sql для вышеуказанного?

+0

Можете ли вы использовать любой язык сценариев? Это может облегчить ситуацию. –

+0

Я использую php ... – Radhe

+0

Возможно, вы должны использовать курсор? выберите первую дату в первом цикле, а затем dateadd (1, d, date) каждое взаимодействие при вставке ... http://ekdd.co.il/loop-though-each-query-results/ – eugeneK

ответ

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); 
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); 
    } 
+0

где переменная '$ end', исходящая из цикла while? – Sarfraz

+0

Cheers @Sarfraz, забыли добавить '_timestamp' там. Исправленный. –

+0

И никто не думает о реляционной модели, которая говорит, чтобы хранить только фактические данные, а не пустые листы. –

7

чистый раствор 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); 
+2

+1 приятно! ------------- –

+0

Вероятно, более полезно писать с двумя параметрами для даты начала и окончания. ИЛИ пусть он заберет последнюю дату в таблице дат и, возможно, оттуда. – jmucchiello

0

Я знаю простой запрос, который работает на Oracle, но я понятия не имею, если она будет работать на MySql

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

Просто замените sysdate с аргументом который содержит дату, с которой вы хотите начать, и замените 365 на количество дней, которые вы хотите просмотреть.

Надеюсь, это поможет. Я не тестировал его работу полностью, но он должен быть очень быстрым.

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

и его супер быстро, как хорошо!

Смежные вопросы