2013-09-04 2 views
1

Я работаю с базой данных MySQL, и мне нужно создать интервал дат за указанный период (заданный датой начала и окончания) с указанным шагом (например, один день).Генерация интервалов дат MySQL

Я написал хранимую процедуру для генерации интервалов, создания временной таблицы и заполнения этой таблицы интервалами.

DELIMITER $$ 
CREATE PROCEDURE showu(IN start date, IN stop date) 
BEGIN 

    CREATE TEMPORARY TABLE intervals(single_day DATE); 
    next_date: LOOP 
     IF start>stop THEN 
      LEAVE next_date; 
     END IF; 
     INSERT INTO intervals(single_day) VALUES(start); 
     SET start = DATE_ADD(start, INTERVAL 1 DAY); 
    END LOOP next_date; 

END$$ 
DELIMITER ; 

Я хочу использовать эту временную таблицу в запросах соединения. Однако я столкнулся с проблемой. Когда я вызываю вызов процедуры showu('2008-01-09', '2010-02-09');, он выполняет приблизительно 30 секунд. Вопрос, почему он так долго выполняется? Можно ли улучшить его? Если это решение неверно, как я могу решить свою проблему по-другому?

+0

30 вторыми для этой процедуры слишком много, но я не тот, кто любит временную таблицу. Можете ли вы дать больше о том, почему вы хотите это сделать, может быть, у меня есть другой способ сделать это? –

+0

Вы можете. Используйте приложение для этого. Серьезно - DB не должен использоваться таким образом. Если вы все еще хотите использовать это - просто заполните постоянную (не временную) таблицу с необходимыми данными один раз. –

+0

@SumitGupta Временная таблица - единственный способ, которым я основал. Раньше я использовал базу данных PostgreSQL. Он имеет функцию generate_series(), которая возвращает мне множество интервалов. Этот набор я могу использовать как таблицу. Я искал, как я могу сделать то же самое в MySQL, и единственным решением, которое я основал, была временная таблица. Мне нужно решить эту проблему, и я принимаю любое предложение. – mvb13

ответ

1

Из комментариев:

2 большие проблемы: 1. Я не знаю точно значение шага (один день или один месяц или один час).

Создать один большой стол, как это когда-то (не временные):

full_date | year | month | day | full_time | hour | minute | is_weekend | whatever 
---------------------------------------------------------------------------------- 
... 

Создать стольких индексов по мере необходимости, и вы будете иметь очень производительный мощный швейцарский нож для всех видов отчетов.

Примечание: Возможно, у вас нет времени и даты в одной таблице. Это просто для упрощения примера.

Вашей второй проблема

Я забиваю свою базу данных с не моделью данных.

нет проблем. Базы данных для хранения данных. Вот и все. Если у вас проблемы с пространством или что-то еще, решение состоит в том, чтобы получить больше места, а не ограничить вашу способность работать эффективно.

Это, как говорится, вот несколько примеров использования этой таблицы.

Вам нужна дата:

SELECT 
* 
FROM 
(
    SELECT full_date AS your_step 
    FROM your_new_swiss_army_knife 
    WHERE `year` = 2012 
    GROUP BY full_date 
) dates 
LEFT JOIN your_tables_that_you_want_to_build_a_report_on y ON dates.your_step = y.date 

Same с месяцем:

SELECT 
* 
FROM 
(
    SELECT CONCAT(year, '-', month) AS your_step 
    FROM your_new_swiss_army_knife 
    WHERE full_date BETWEEN this AND that 
    GROUP BY year, month 
) dates 
LEFT JOIN your_tables_that_you_want_to_build_a_report_on y ON dates.your_step = CONCAT(YEAR(y.date), '-', MONTH(y.date)) 
+0

@ mvb13 Итак, какие-либо отзывы до сих пор? – fancyPants

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