Mysql:select两个date之间的所有数据

我有一个数据连接到date的MySQL表。 每行都有数据和date,如下所示:

2009-06-25 75 2009-07-01 100 2009-07-02 120 

我有一个MySQL查询select两个date之间的所有数据。 这是查询:

SELECT data FROM tbl WHERE date BETWEEN date1 AND date2

我的问题是,我也需要获取date1和date2之间的行,即使没有一天的数据。

所以我的查询将错过2009-06-25和2009-07-01之间的空的date。

我可以以某种方式添加这些date只有0作为数据?

您可以使用经常被称为“日历表”的概念。 这里是如何在MySql中创build日历表的很好的指导:

 -- create some infrastructure CREATE TABLE ints (i INTEGER); INSERT INTO ints VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9); -- only works for 100 days, add more ints joins for more SELECT cal.date, tbl.data FROM ( SELECT '2009-06-25' + INTERVAL ai * 10 + bi DAY as date FROM ints a JOIN ints b ORDER BY ai * 10 + bi ) cal LEFT JOIN tbl ON cal.date = tbl.date WHERE cal.date BETWEEN '2009-06-25' AND '2009-07-01'; 

您可能想要创build表cal而不是子查询。

 Select * from emp where joindate between date1 and date2; 

但是这个查询不显示正确的数据。

例如

 1-jan-2013 to 12-jan-2013. 

但它是显示数据

 1-jan-2013 to 11-jan-2013. 

这很容易处理这种情况

您可以将BETWEEN CLAUSEdate_sub(now(),INTERVAL 30 DAY)和NOW()

 SELECT sc_cust_design.design_id as id, sc_cust_design.main_image, FROM sc_cust_design WHERE sc_cust_design.publish = 1 AND **`datein`BETWEEN date_sub( now( ) , INTERVAL 30 DAY ) AND NOW( )** 

快乐编码:)

你有一个有所有date的桌子吗? 如果没有,您可能需要考虑实施一个日历表,并将您的数据连接到日历表上。

如果你可以避免它..不要这样做

数据库不是真正为此devise的,而是有效地尝试在查询中创build数据(尽pipe是date列表)。

对于数据库查询上方有应用程序层的人,最简单的解决scheme是在那里填写空白数据。

无论如何,您将很可能循环查询结果,并且可以实现如下所示:

 loop_date = start_date while (loop_date <= end_date){ if(loop_date in db_data) { output db_data for loop_date } else { output default_data for loop_date } loop_date = loop_date + 1 day } 

这样做的好处是减less了数据传输; 更简单,更容易debugging查询; 而且不用担心日历表的过度stream动。

您必须在结束date中添加1天,使用: DATE_ADD('$end_date', INTERVAL 1 DAY)