【问题标题】:Find missing dates in php在php中查找丢失的日期
【发布时间】:2014-08-12 05:45:59
【问题描述】:

嗨,我有两个文本框用于日期 fromto。当我在两个文本框中选择日期时,代表一个时间间隔,我想填写缺失的日期,所以我可以查询我们的表中的一些记录以及日期假设我有

2014-08-02  
2014-08-08      
2014-08-10      
2014-08-11  
2014-08-07  
2014-08-12  

或者可能是另一个日期,请帮助我

<?php
$from='2014-08-11'; 
$to='2014-09-10';

$query="SELECT * FROM stats WHERE Feeddate BETWEEN '2014-08-11' AND '2014-09-10'"; 
?>

【问题讨论】:

  • 不过我不太明白。假设您有2014-08-112014-09-10。查找缺失的日期是什么意思?
  • 当我执行查询时,我们表中与日期相关的所有记录假设我在执行查询时在表中有 2014-08-02,2014-08-08 与此日期相关的两条记录缺少日期将是 2014-08-03,2014-08-04,2014-08-05,2014-08-06,2014-08-07
  • 你是指中间的日期?
  • 是的,我从哪一天开始知道我忘记更新或添加我们的软件记录的确切日期
  • 据我了解,您希望生成介于2014-08-032014-08-05m 之间的日期列表,即2014-08-032014-08-042014-08-05。我的假设是否正确?

标签: php mysql


【解决方案1】:

没有测试它,但是像这样。您需要为您要查找的范围内的一系列日期创建一个临时表。例如 2014-08-11 到 2014-09-10。这有一种方法:

Generating a series of dates

然后你会想要查询这个

SELECT *
FROM x
(
     SELECT date 
     FROM dateseries
     WHERE date BETWEEN '2014-08-11' AND '2014-09-10'
) as x
WHERE NOT IN ( 
    SELECT date 
    FROM stats
    WHERE Feeddate BETWEEN '2014-08-11' AND '2014-09-10'
);

希望您能理解。只知道 MySql 在子查询优化方面很糟糕,所以您可能希望将该子查询移动到连接中。

【讨论】:

    【解决方案2】:
    $from   = '2014-08-11'; 
    $to     = '2014-09-10';
    $query  = "SELECT Feeddate FROM stats WHERE Feeddate BETWEEN '$from' AND '$to' ORDER BY Feeddate";
    
    $cursor = DateTime::createFromFormat('Y-m-d', $from);
    $res    = mysql_query($query);
    
    while ($row = mysql_fetch_assoc($res))
    {
        $date = DateTime::createFromFormat('Y-m-d', $row['Feeddate']);
        while ($cursor != $date)
        {
            echo "Day is missing: " . $cursor->format('Y-m-d') . "<br>";
            $cursor->modify('+1 day');
        }
        $cursor->modify('+1 day');
    
    }
    

    【讨论】:

      猜你喜欢
      • 2011-07-28
      • 1970-01-01
      • 1970-01-01
      • 2016-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多