2013-04-24 4 views
2

다음 주 코드를 사용하여 1 년 동안의 주 숫자에 해당하는 MySQL 테이블의 모든 항목을 가져 오기 위해 Google 차트를 작성합니다. 그 순간에 주 숫자가 일요일에 시작되고 월요일에 시작할 수 있도록이 번호를 변경하려고합니다. 그러나 어떻게해야할지 모르겠습니다.PHP/MySQL에서 Week (Date)를 사용할 때주의 첫날을 Monday로 어떻게 설정합니까?

$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++; 
    } 

REVISED CODE

$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

+0

@Strawberry 당신이 옳을 수도 있습니다. 'SELECT * from patient_sessions'를 사용하고 루프를 사용하여 모든 결과를 확인 하시겠습니까? 나는 그래프가 느리게로드되는 것을 알아 챘다. 아마도 이것이 이유일까요? 일반적으로 위와 같은 방식으로 PHP 루프가 쿼리를 사용하는 것보다 빠르게 작동합니까? – Nick

+0

일반적으로 (물론 예외가 있습니다.) 가능한 한 데이터베이스 왕복 횟수를 줄이고 싶습니다. 귀하의 전략은 53 회의 여행을 만듭니다. 내 것은 1을 만듭니다. 그러나 문제는 "SELECT *"가 아닙니다. 그것은 "Where Week (Date) = '$ i'"입니다. GROUP BY를 참조하십시오. – Strawberry

답변

8
WEEK(date[mode]); 

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

기본 arugment 등등 월요일 2 화 될 것이다 1로 설정되는 일요일 0이다. 이 코드에서 작동하려면

week(date,1); 
+0

고마워요. 그건 잘 작동합니다. – Nick

+3

@ gardni "1을 월요일로 설정하면 2 화요일에"가 맞지 않습니다. [documentation] (http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_week)에 따르면 주 시작은 일요일 또는 월요일, 차이점은 일주일이 일년 중 일부로 결정되는 방식입니다. 그렇지 않으면 좋은 대답입니다. – miah

0

것은, 당신이 쿼리를 변경 할 수 있어야한다 : 그러나

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

, 나는 한 단계 더 나아가 하나를 만들기 위해 GROUP BY를 사용할 수 있다고 생각 SQL 호출을 호출 한 다음 결과를 반복합니다.

또는 몇 년 사이의 주간 처리 방법에 따라 WEEK (날짜, 2)를 사용해야 할 수도 있습니다.