2013-04-24 149 views
2

我正在使用下面的代碼來構建一個Google圖表,以便在一年內對應於一週數字的MySQL表格中提取所有條目。目前,週數開始於星期天,我想改變這一點,以便他們在星期一開始,但我不知道如何做到這一點。如何在PHP/MySQL中使用Week(Date)時將星期幾的第一天設置爲星期一?

$i=1; 
    while($i<=53) 
     { 
     $week_start = new DateTime(); 
     $week_start->setISODate(2013,$i+1); 
     $date_display = $week_start->format('j M Y'); 

     $sessions = $wpdb->get_var($wpdb->prepare("SELECT Sum(Due) from patient_sessions WHERE Type='Session' AND Week(Date)='$i'")); 

     $temp = array(); 

     $temp[] = array('v' => (string) $date_display); 
     $temp[] = array('v' => (string) $sessions); 
     $rows[] = array('c' => $temp); 
     $i++; 
    } 

修改後的代碼

$sessions = $wpdb->get_results($wpdb->prepare("SELECT Due,Date from patient_sessions WHERE Type='Session'")); 
$work_times = $wpdb->get_results($wpdb->prepare("SELECT Amount,Date from work_times")); 
$expenses = $wpdb->get_results($wpdb->prepare("SELECT Amount,Date from expenses WHERE Client='Psychotherapy'")); 

$i=1; 
while($i<=53) { 
    $week_start = new DateTime(); 
    $week_start->setISODate(2013,$i+1); 
    $date_display = $week_start->format('j M Y'); 

    $session_total = 0; 
    $work_time_total = 0; 
    $expense_total = 0; 


     foreach ($sessions as $session) { 
    if (date("W", strtotime($session->Date)) == $i) { 
    $session_total = ($session_total+$session->Due); 
    } 
    } 

     foreach ($work_times as $work_time) { 
    if (date("W", strtotime($work_time->Date)) == $i) { 
    $work_time_total = ($work_time_total+$work_time->Amount); 
    } 
    } 

      foreach ($expenses as $expense) { 
    if (date("W", strtotime($expense->Date)) == $i) { 
    $expense_total = ($expense_total+$expense->Amount); 
    } 
      } 

    $balance = ($session_total + $work_time_total - $expense_total); 

    $temp = array(); 

    $temp[] = array('v' => (string) $date_display); 
    $temp[] = array('v' => (string) $balance); 
    $rows[] = array('c' => $temp); 
    $i++; 
} 
+0

這似乎是一個非常低效的做法!只需一次獲取所有結果,然後遍歷結果集。 – Strawberry 2013-04-24 16:11:49

+0

@Strawberry你可能是對的。你的意思是使用'來自patient_sessions的SELECT *',然後使用循環遍歷所有結果?我注意到圖表加載速度很慢。據推測這是爲什麼?一般情況下,PHP循環的運行速度比以上述方式使用查詢快嗎? – Nick 2013-04-24 17:06:02

+0

通常(當然也有例外),您希望儘可能少地往返數據庫。你的策略使53次旅行。我做了1.但是,問題不在於「SELECT *」。這是「WHERE Week(Date)='$ i'」。請參閱GROUP BY。 – Strawberry 2013-04-25 08:35:51

回答

8
WEEK(date[mode]); 

date = a date value.  
mode = An integer indicating the starting of the week. 

默認arugment是0即星期日,將其設置爲1將在週一,週二2等。

week(date,1); 
+0

謝謝。這工作正常。 – Nick 2013-04-24 16:11:09

+3

@gardni「將其設置爲1將是星期一,2星期二」並非如此。根據[文檔](http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_week),本週的開始時間爲星期日或星期一,不同之處在於一個星期如何決定成爲一年的一部分。否則,很好的答案。 – miah 2013-04-24 16:27:07

0

對於它在你的代碼工作,你應該能夠查詢更改爲:

"SELECT Sum(Due) FROM patient_sessions WHERE Type='Session' AND Week(Date,1)=$i" 

不過,我想我會走一步,並使用GROUP BY做一個sql調用,然後迭代結果;

"SELECT Week(Date,1), SUM(DUE) FROM patient_sessions WHERE Type='Session' GROUP BY Week(Date,1)" 

或者,您可能需要使用WEEK(日期2),具體取決於您希望如何處理幾周之間的幾周。

相關問題