2014-12-30 55 views
0

我有以下查詢:獲取查詢結果的日期範圍

$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");    

對於單一的一天,我現在得到期望的結果,這是從我的數據庫復發事件對於給定的起始日期。
但是,當給出日期範圍(即開始和結束日期)時,我不確定如何在避免循環的同時在單個查詢中獲取所有結果,並考慮到仍會獲取循環事件。

有什麼建議嗎?

編輯:表結構很簡單:

events_dates_recurrent

event_id | start_date | end_date | repeat_interval 

如果事件ID被鏈接到表events與內連接。
我需要檢索給定日期範圍內的所有經常性事件。
現在可以忽略'events_dates_recurrent'表中的end_date,這可能稍後可能會用於此目的,但對於此查詢不是嚴格要求的。

+0

你能編輯你的問題,並添加表結構和預期的結果嗎? – lukasgeiter

+0

@lukasgeiter更新結構。 – Trace

+0

你是經典的經常性記錄問題。我目前無法回答,也許其他人會回答。另請考慮[this](http://stackoverflow.com/a/14660169/1903366) – lukasgeiter

回答

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); 
    });