44

我有一个 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 的数据吗?

4

7 回答 7

38

您可以使用经常被称为“日历表”的概念。是关于如何在 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而不是子选择。

于 2009-07-03T17:59:41.980 回答
12
Select *  from  emp where joindate between date1 and date2;

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

例如

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

但它是显示数据

1-jan-2013 to 11-jan-2013.
于 2013-09-19T14:46:18.500 回答
10

这种情况很容易处理

您可以将BETWEEN CLAUSE与date_sub( now( ) , INTERVAL 30 DAY ) AND 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( )**

快乐编码:)

于 2013-10-30T06:32:49.247 回答
4

你有一张包含所有日期的表格吗?如果没有,您可能需要考虑实现一个日历表并将您的数据连接到日历表中。

于 2009-07-03T17:18:10.520 回答
1

您必须将 1 天添加到结束日期,使用: DATE_ADD('$end_date', INTERVAL 1 DAY)

于 2016-12-08T12:17:38.583 回答
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
}

这样做的好处是减少了数据传输;更简单、更容易调试查询;并且不用担心日历表溢出。

于 2016-04-14T14:12:25.270 回答
-1

您可以用作替代解决方案:

SELECT * FROM TABLE_NAME WHERE `date` >= '1-jan-2013' 
OR `date` <= '12-jan-2013'
于 2018-04-03T14:55:22.990 回答