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 CLAUSE与date_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)