Codeigniter每天查询数据库中的数据

时间:2015-01-15 10:25:04

标签: php mysql codeigniter

我有一个$from date$to date,所以我想在$from$to之间的数天内从数据库中提取四个值,包括{{1 }和$from。如果数据在数据库中的某一天不存在,则必须将零作为缺失值的值放置。

那么我如何在codeigniter中编写一个查询来实现它,并且相应的日期应存储在特定行的结果中。

3 个答案:

答案 0 :(得分:1)

我之前的解决方案是我使用PHP检查并为缺少日期设置零。但我有一些新的解决方案,您可以尝试

  1. 创建一个表来存储日期和左/右连接与您的表
  2. 或使用存储过程创建临时表并加入。会话过期时将自动删除临时
  3. 将UNION与select语句一起使用
  4. StackOverflow上有很多答案 MySQL how to fill missing dates in range? MySQL group by date and count including missing dates Running total over date range - fill in the missing dates MySQL to fill in missing dates when using GROUP BY DATE(table.timestamp) without joining on temporary table

答案 1 :(得分:0)

我认为您的解决方案实际上需要在PHP中,并且不确定您是否可以通过查询直接从MYSQL获取您正在寻找的内容。根据我的理解,您想要运行查询,获取所定义日期范围内的所有记录,然后让没有记录的日期具有空行(或者您决定使用任何其他值...)。

我实际上会运行相同的查询来选择日期范围之间的行,并使用DatePeriod Class生成一个包含开始日期和结束日期之间所有日期的数组。

$begin = new DateTime( '2012-08-01' );
$end = new DateTime( '2012-10-31' );
$end = $end->modify( '+1 day' );

$interval = new DateInterval('P1D');
$daterange = new DatePeriod($begin, $interval ,$end);

foreach($daterange as $date){
    echo $date->format("Y-m-d") . "<br>";
}

有了这个,我们就可以在$from_date$end_date的每一天运行。

接下来,我们需要从数据库中获取其他行,并根据我们所拥有的daterange对象查看哪些日期有记录,哪些日期没有。

这是一种可行的方法我认为,它不是最干净的样本,而是一些额外的工作,你可以使它更漂亮,但我认为这将适合你所需要的。

代码中的数据库部分不在Codeigniter中,但由于它只是一个简单的查询,因此您不应该在更改它时遇到任何问题。

// set the start & end dates
$from_date = '2012-09-11';
$to_date     = '2012-11-11';

// create a daterange object
$begin         = new DateTime($from_date);
$end           = new DateTime($to_date );
$end            = $end->modify( '+1 day' );
$interval      = new DateInterval('P1D');
$daterange = new DatePeriod($begin, $interval ,$end);

$sth = $dbh->prepare("SELECT col1, dateCol from tb WHERE dateCol>'".$from_date."' AND dateCol<'".$to_date."' order by dateCol ");
$sth->execute(); 
$rows = $sth->fetchAll(PDO::FETCH_ASSOC);

$rowsByDay = array(); // will hold the rows with date keys

// loop on results to create thenew rowsByDay
foreach($rows as $key=>$row) {
    $rowsByDay[strtotime($row['dateCol'])][] = $row; // add the row to the new rows array with a timestamp key
}

// loop of the daterange elements and fill the rows array 
foreach($daterange as $date){
    if(!isset($rowsByDay[strtotime($date->format("Y-m-d"))])) // if element does not exists - meaning no record for a specific day
    {
        $rowsByDay[strtotime($date->format("Y-m-d"))] = array(); // add an empty arra (or anything else)
    }
}

// sort the rowsByDay array so they all are arrange by day from start day to end day
ksort($rowsByDay); 


// just for showing what we get at the end for rowsByDay array
foreach ($rowsByDay as $k=>$v) {
    echo date('Y-m-d',$k);
    var_dump($v);
    echo '<hr/>';
}

希望这能让你以正确的方式......

答案 2 :(得分:-1)

希望这有帮助,

$this->db->where('date_column >= ',$date_given_start);
$this->db->where('date_column <= ',$date_given_end);
$this->db->get('TABLE_NAME')->result();


// if column is datetime
$this->db->where('DATE(date_column) >= ',$date_given_start);
$this->db->where('DATE(date_column) <= ',$date_given_end);
$this->db->get('TABLE_NAME')->result();