我有一个mysql表,数据连接到日期。每行都有数据和日期,如下所示:
2009-06-25 75
2009-07-01 100
2009-07-02 120
我有一个mysql查询,可以选择两个日期之间的所有数据。这是查询:
SELECT data FROM tbl WHERE date BETWEEN date1 AND date2
我的问题是,即使一天没有数据,我也需要在date1和date2之间获取行。
所以我的查询会错过2009-06-25和2009-07-01之间的空白日期。
我能否以某种方式将这些日期添加为0作为数据?
答案 0 :(得分:38)
您可以使用经常被称为“日历表”的概念。 Here是如何在MySql中创建日历表的一个很好的指南:
-- 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 a.i * 10 + b.i DAY as date
FROM ints a JOIN ints b
ORDER BY a.i * 10 + b.i
) cal LEFT JOIN tbl ON cal.date = tbl.date
WHERE cal.date BETWEEN '2009-06-25' AND '2009-07-01';
您可能想要创建表cal
而不是子选择。
答案 1 :(得分:12)
Select * from emp where joindate between date1 and date2;
但是这个查询没有显示正确的数据。
例如
1-jan-2013 to 12-jan-2013.
但它是显示数据
1-jan-2013 to 11-jan-2013.
答案 2 :(得分:10)
很容易处理这种情况
您可以将 BETWEEN CLAUSE 与 date_sub(now(),INTERVAL 30 DAY)结合使用 现在()
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( )**
快乐编码:)
答案 3 :(得分:4)
你有一张包含所有日期的桌子吗?如果没有,您可能需要考虑实施日历表并将数据加入日历表。
答案 4 :(得分:1)
如果你能避免它......不要那样做
数据库并非真正为此而设计,您实际上是在尝试在查询中创建数据(尽管是日期列表)。
对于在数据库查询之上有应用程序层的任何人,最简单的解决方案是在那里填写空白数据。
无论如何,你很可能会循环查询结果,并且可以实现类似的东西:
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
}
这样做的好处是减少了数据传输;更简单,更容易调试查询;并且不用担心日历表过度流动。
答案 5 :(得分:1)
您必须使用:DATE_ADD('$end_date', INTERVAL 1 DAY)
答案 6 :(得分:-1)
您可以用作备用解决方案:
SELECT * FROM TABLE_NAME WHERE `date` >= '1-jan-2013'
OR `date` <= '12-jan-2013'