获取日期范围的查询结果

时间:2014-12-30 22:25:10

标签: php mysql sql laravel-4 orm

我有以下查询:

    $input_datestart = date("Y-m-d", strtotime($data["date_start"]));
    $input_dateend = date("Y-m-d", strtotime($data["date_end"]));

    //Calculate the recurrent dates 
    $query = $query->join('events_dates_recurrent', 'events.id', '=', 'events_dates_recurrent.event_id')
        ->whereRaw("ABS(DATEDIFF('" . $input_datestart . "', CAST(events_dates_recurrent.start_date AS DATE)) % events_dates_recurrent.repeat_interval) = 0");             

对于一天,我现在得到了所需的结果,即从我的数据库中获取给定start_date的重复事件。
但是,当给出日期范围(即开始和结束日期)时,我不确定如何在避免循环的同时在单个查询中获得所有结果,同时考虑到仍然要获取循环事件。

有什么建议吗?

编辑:表格结构相当简单:

events_dates_recurrent

event_id  |  start_date  |  end_date  |  repeat_interval 

将事件ID链接到具有内部联接的表events 我需要检索给定日期范围内的所有重复事件 来自' events_dates_recurrent'的end_date表格现在可以忽略,也许这可能会在以后用作目的,但这个查询并不是严格要求的。

1 个答案:

答案 0 :(得分:0)

我对这个解决方案并不是特别满意,但是它做了它应该做的事情: 我基本上做的是循环输入日期间隔并创建一个动态查询字符串 我的应用程序始终将请求的日期/时间间隔限制为@maximum 1个月,因此查询字符串不应超过最大字符串限制。
我不是100%关于性能,我们将看到它是如何工作的。

//Calculate the recurrent dates 
$query = $query->join('events_dates_recurrent', 'events.id', '=', 'events_dates_recurrent.event_id')
    ->where(function($join) use ($input_date_start, $input_date_end) { 
        //Create a dynamic query to get all recurrent dates within the input time interval 
        $query_string = "ABS(DATEDIFF('" . $input_date_start . "', CAST(events_dates_recurrent.start_date AS DATE)) % events_dates_recurrent.repeat_interval) = 0"; 
        $temp_date_start = $input_date_start; 

        while(strtotime($temp_date_start) <= strtotime($input_date_end)){ 
            $temp_date_start = date('Y-m-d',strtotime($temp_date_start . " +1 day")); 
            //Create a raw query string 
            $query_string = $query_string . " OR ABS(DATEDIFF('" . $temp_date_start . "', CAST(events_dates_recurrent.start_date AS DATE)) % events_dates_recurrent.repeat_interval) = 0"; 
        } 
        $join->whereRaw($query_string); 
    });