MySQL日期间隔生成

时间:2013-09-04 06:56:35

标签: mysql sql

我正在使用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秒。它为什么执行这么久的问题?有可能改善它吗?如果这个解决方案错了,我怎么能以不同的方式解决我的问题?

1 个答案:

答案 0 :(得分: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

与月份相同:

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