Mysql:选择两个日期之间的所有数据

时间:2009-07-03 17:12:58

标签: mysql date between

我有一个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作为数据?

7 个答案:

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

在结束日期添加1天

答案 6 :(得分:-1)

您可以用作备用解决方案:

SELECT * FROM TABLE_NAME WHERE `date` >= '1-jan-2013' 
OR `date` <= '12-jan-2013'