Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 返回当月所有日期的结果,即使没有数据_Mysql_Sql_Date_Join_Recursive Query - Fatal编程技术网

Mysql 返回当月所有日期的结果,即使没有数据

Mysql 返回当月所有日期的结果,即使没有数据,mysql,sql,date,join,recursive-query,Mysql,Sql,Date,Join,Recursive Query,我有一个select,它按数据返回数据集。 例子: 如下图所示,没有日期数据:20,21,22。。。二十八 我想把这些结果为空的行 我的选择很简单,日期列有一个每天的日期 SELECT * from rentabilidade_fundos where data BETWEEN '2020-04-01' AND '2020-04-31' order by data 我需要选择返回的方式: 如果您运行的是MySQL 8.0,则可以使用递归查询生成日期列表,然后将其与表左键联接: with

我有一个select,它按数据返回数据集。 例子:

如下图所示,没有日期数据:20,21,22。。。二十八

我想把这些结果为空的行

我的选择很简单,日期列有一个每天的日期

SELECT * 
from rentabilidade_fundos 
where data BETWEEN '2020-04-01' AND '2020-04-31' 
order by data
我需要选择返回的方式:

如果您运行的是MySQL 8.0,则可以使用递归查询生成日期列表,然后将其与表左键联接:

with calendar as (
    select '2020-04-01' dt
    union all select dt + interval 1 day where dt < '2020-04-31' from calendar
)
select c.dt, t.fundo_conservador, t.fundo_moderado, t.fundo_arrojado
from calendar c
left join mytable t on t.data = c.dt
然后,您可以使用它代替递归cte生成的派生表:

select c.dt, t.fundo_conservador, t.fundo_moderado, t.fundo_arrojado
from calendar c
left join mytable t on t.data = c.dt
where c.dt >= '2020-04-01' and c.dt < '2020-05-01'

要解决这个问题,您需要在需要的时间段内生成所有日期。然后,您可以加入需要查询的表。这是我的解决办法

正在尝试复制表及其值

插入rentabilidade_fundos数据、conservado、moderado、arrojado 价值观 '2020-04-01', 1, 1, 1, '2020-04-02', 2, 2, 2, '2020-04-03', 3, 3, 3, '2020-04-15', 15, 15, 15, '2020-04-21', 21, 21, 21, '2020-04-25', 25, 25, 25, '2020-04-29', 29, 29, 29, '2020-04-30', 30, 30, 30; 表中的数据如下所示。 .

要提取过去30天内开始日期为2020-04-01的所有字段,您可以使用以下查询

设置@i=-1; 设置@stop=29; 选择rf.id、x.date、rf.conservato、rf.moderado、rf.arrojado 来自rentabilidade_fundos rf 右连接 选择DATEADDDATE'2020-04-01',间隔@i:=@i+1天作为rentabilidade_fundos的日期 有@i<@停止 x.date上的x=射频数据 在x.date之前订购; 最终结果如下。

外部加入日历帮助表/cte。
select c.dt, t.fundo_conservador, t.fundo_moderado, t.fundo_arrojado
from calendar c
left join mytable t on t.data = c.dt
where c.dt >= '2020-04-01' and c.dt < '2020-05-01'