Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.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
Php 在MySQL范围内的所有日期加入_Php_Mysql_Date - Fatal编程技术网

Php 在MySQL范围内的所有日期加入

Php 在MySQL范围内的所有日期加入,php,mysql,date,Php,Mysql,Date,我有下表: administratieID | varchar getalTypeNaam | varchar datum | date waarde | double 使用以下查询: Select administratieID AS AI, waarde WA, datum DT

我有下表:

administratieID        |     varchar
getalTypeNaam          |     varchar
datum                  |     date
waarde                 |     double
使用以下查询:

                                Select administratieID AS AI, waarde WA, datum DT
                                from getalType
                                where getalTypeNaam = 'test'
                                and datum between DATE_SUB(NOW(), INTERVAL 10 DAY)  and DATE_SUB(NOW(), INTERVAL 15 DAY) 
                                order by datum
我想要的是,我可以选择返回指定日期之间的所有日期,即使数据库中没有与该日期相关的内容。即使没有值,我也需要它,但在这种情况下,我希望返回值0

所以我想要这个作为回报:


有很多方法可以做到这一点,但它们都很老套

一种方法是使用一个内联递增变量,并使用一个虚拟表,您知道该表中的记录数至少与日期范围中的最大天数相同。然后你可以这样做:

SET @date = DATE_SUB(NOW(), INTERVAL 15 DAY);  #or whatever the earliest date you need is



SELECT DISTINCT
      IFNULL(administratieID,'XXX') AS AI
    , IFNULL(waarde,0) AS WA
    , all_dates AS DT
FROM 
     (SELECT @date:=DATE_ADD(@date, INTERVAL 1 DAY) AS all_dates
     FROM
    my_dummy_table_with_lots_of_records
    WHERE @date >= DATE_SUB(NOW(), INTERVAL 15 DAY) AND @date <= DATE_SUB(NOW(), INTERVAL 10 DAY)) d LEFT JOIN

    getalType t ON
         DATE_FORMAT(all_dates,'%Y-%m-%d') = DATE_FORMAT(t.datum,'%Y-%m-%d')   
WHERE
    IFNULL(getalTypeNaam, 'Test') = 'Test'  #if there's no data we still need to return something

ORDER BY all_dates;
另一种更简单的方法是创建一个名为all_dates的表,您可以在连接中使用它。该表只有一列datum,您可以使用getalType表中可能使用的每个日期填充它。这甚至可以用触发器来完成

然后你链接到这个表,而不是做上面所有派生的废话


这还可以避免必须有多个sql语句,因为您没有需要初始化的变量。

您当前得到了什么,我将在这两者之间更改参数。您正在检查的实际情况,例如2017-01-20和2017-01-15之间的expr[非]开始expr和结束expr;如果expr的值大于或等于>=begin_expr的值且小于或等于以处理应用程序代码中丢失结果的逻辑,BEVER运算符将返回true。@JustOnUnderMillions我用现在得到的编辑结果进行了编辑。@是的,我可能应该这样做,但这会使设置更容易事情进展顺利。嗯,我想我得重写一下。照@草莓说的做。对结果进行迭代,并使用waarde 0添加缺少的行。这不能用sql实现。如果11-10-2016不在表中,则无法选择。顺便说一句,如果有人认为我疯了,我测试了上述sql,它确实返回了所需的数据集。这不是理论上的。这里也有一个非常类似的问题和解决方案:谢谢你,它确实有效,我甚至有些理解为什么。。有点
date       administratieID waarde
10-10-2016 xxx                 10
12-10-2016 xxx                 40
13-10-2016 xxx                  9
SET @date = DATE_SUB(NOW(), INTERVAL 15 DAY);  #or whatever the earliest date you need is



SELECT DISTINCT
      IFNULL(administratieID,'XXX') AS AI
    , IFNULL(waarde,0) AS WA
    , all_dates AS DT
FROM 
     (SELECT @date:=DATE_ADD(@date, INTERVAL 1 DAY) AS all_dates
     FROM
    my_dummy_table_with_lots_of_records
    WHERE @date >= DATE_SUB(NOW(), INTERVAL 15 DAY) AND @date <= DATE_SUB(NOW(), INTERVAL 10 DAY)) d LEFT JOIN

    getalType t ON
         DATE_FORMAT(all_dates,'%Y-%m-%d') = DATE_FORMAT(t.datum,'%Y-%m-%d')   
WHERE
    IFNULL(getalTypeNaam, 'Test') = 'Test'  #if there's no data we still need to return something

ORDER BY all_dates;