从MySQL中的表中选择缺少的日期

从MySQL中的表中选择缺少的日期,mysql,chart.js,Mysql,Chart.js,我在想,做我想做的事情的最佳方式是什么。正如标题所说,我在mysql中有一个缺少日期的表,如下所示: +------------+ | 2015-09-01 | | 2015-09-03 | | 2015-09-05 | | 2015-09-06 | | 2015-09-07 | +------------+ 我想选择它们,为它们分配另一列null值,因此如果我还想选择缺少的日期(在我的情况下是第2天和第4天),我的选项是什么?我想制作一个“日历”表,用左连接选择这两个表,并使用not in,

我在想,做我想做的事情的最佳方式是什么。正如标题所说,我在mysql中有一个缺少日期的表,如下所示:

+------------+
| 2015-09-01 |
| 2015-09-03 |
| 2015-09-05 |
| 2015-09-06 |
| 2015-09-07 |
+------------+
我想选择它们,为它们分配另一列
null
值,因此如果我还想选择缺少的日期(在我的情况下是第2天和第4天),我的选项是什么?我想制作一个“日历”表,用左连接选择这两个表,并使用
not in
,但这意味着我必须用大量的日期来填充它(以防有人出于某种原因想要选择2500年或1800年的数据,我不希望这样)

我不喜欢使用日历表的选项,因为这是性能方面的问题,但这也带来了另一个问题:如果我仍然使用日历表,并且限制人们选择过去或未来的日期(这样我就不用再为一些疯狂的灵魂决定从日历表中选择日期而花费数百年的时间),我怎样才能使表格自动填充,使其具有当前日期的日期,而不必手动插入当前日期

触发器/函数是否可以每天自行运行并在其中插入当前日期

编辑:我的目的是使用chartjs表,这样它就可以在缺少数据的地方有“洞”(空值)。

检查以下内容:

select this_date,given_dates from
(SELECT ADDDATE('2015-09-01', INTERVAL @i:=@i+1 DAY) AS this_date
        FROM (
        SELECT a.a
        FROM (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS a
        CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS b
        CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS c
        ) a
        JOIN (SELECT @i := -1) r1
        WHERE 
        @i < DATEDIFF('2018-01-30', '2015-09-01')) as a

left JOIN

(select given_dates from
 (select '2015-09-01' as given_dates union all 
select  '2015-09-03' union all 
select  '2015-09-05' union all 
select  '2015-09-06' union all 
select  '2015-09-07') as a) as b
on a.this_date = b.given_dates

你可以很容易地得到它的空值。

检查这一点更好的解决方案是在调用SQL、IOW php或java或其他函数的程序中执行此操作。这并不是SQL中最好的方法。您也可以将此查询用作子查询,这样您就可以得到您想要的。谢谢。。如果可以的话,我会尝试一些解决办法。@sloasher我想他是问你我的问题的意思。我会尽你所能地安排一段长时间的约会。。这只是你指定日期的细节,让它更快。如果你想做一些修改,请告诉我。抱歉,不包括第三列看起来不错,但我有一个包含4-5年数据的表,这意味着手动添加这些数据将是自杀。我不明白的是所有这些
UNION-all选择1 UNION-all…
是如何工作的。你必须让它的开始日期和结束日期更长
2015-09-01  2015-09-01  
2015-09-02      
2015-09-03  2015-09-03  
2015-09-04      
2015-09-05  2015-09-05  
2015-09-06  2015-09-06  
2015-09-07  2015-09-07  
2015-09-08      
2015-09-09      
2015-09-10      
2015-09-11