1

假设您有下表values

date       | value
2012-01-01 |    8
2012-01-02 |    3
2012-01-03 |   17
2012-01-09 |  100
2012-01-12 |    2

现在假设您要选择 2012-01-02 和 2012-01-12 之间的所有日期并显示它们的值(如果存在)。如果您只是在表中查询适当的日期范围,那么出于显而易见的原因,没有值的日期将不存在。有没有办法在查询中填写这些日期?

显而易见的解决方案是创建一个dates只存储可能出现的所有日期列表的表,然后从dates表中选择并加入values它,但我希望有一个不依赖于创建如果可以的话,单列表。

值得注意的是:关于这个主题的SO存在 问题,但它们都是从 2010 年开始的(至少我在搜索时发现的那些是),并且那个时候 MySQL 的功能已经增长;现在可能有一个动态的解决方案。如果不是这种情况,并且表格仍然是最佳解决方案,那么这个问题应该作为重复关闭。dates

4

1 回答 1

0

缺乏其他人的答案向我表明,在当前时间,如果没有包含这些日期的表,就不可能遍历 MySQL 中的一系列日期。但是,我用 PHP 编写了一些代码,用于在事后填写缺失的日期:

function formatResults($inbound, $from, $to) {
    $results = array();
    $count = 0;

    // In order not to lose any results, we have to change how the results are referenced
    $indexes = array();
    $stats = array();
    foreach ($inbound as $stat) {
        // ['listindex'] is the date, renamed in the query
        $stats[$stat['listindex']] = $stat;
    }

    // In a function in case you want to pop it out
    function dateArray($from, $to) {
        $begin = new DateTime($from);
        $end = new DateTime($to);
        $interval = DateInterval::createFromDateString('1 day');
        $days = new DatePeriod($begin, $interval, $end);
        $baseArray = array();
        foreach ($days as $day) {
            $dateKey = $day->format("Y-m-d");
            $baseArray[] = $dateKey;
        }
        $baseArray[] = $to;
        return $baseArray;
    }
    $indexes = dateArray($from, $to);

    // Now all the rows we need to return are uniquely identified in $indexes
    // So we traverse $indexes to create our results array, rather than relying on $inbound
    foreach($indexes as $index) if ($index != '') {
        $data = array();
        // Make sure we do not run into any 'missing index' problems
        if (!isset($stats[$index]))
            $stats[$index] = array(
                'listindex' => $index,
                // ... populate full list of empty fields
            );
        foreach ($stats[$index] as $key => $value) {
            $data[] = $value;
        }
        $results[$count] = $data;
        $count++;
    }
    return $results;
}
于 2013-04-05T12:58:27.137 回答