在PHP/MySQL中使用week(Date)时,如何将一周的第一天设置为周一?

在PHP/MySQL中使用week(Date)时,如何将一周的第一天设置为周一?,php,mysql,date,week-number,Php,Mysql,Date,Week Number,我正在使用下面的代码构建一个Google图表,以获取MySQL表中与一年中的周数对应的所有条目。目前,周数是从周日开始的,我想把它改成从周一开始,但我不知道怎么做 $i=1; while($i<=53) { $week_start = new DateTime(); $week_start->setISODate(2013,$i+1); $date_display = $week_start->format(

我正在使用下面的代码构建一个Google图表,以获取MySQL表中与一年中的周数对应的所有条目。目前,周数是从周日开始的,我想把它改成从周一开始,但我不知道怎么做

$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++;
    }
$i=1;
而($isetISODate(2013,$i+1);
$date\u display=$week\u start->format('j M Y');
$sessions=$wpdb->get_var($wpdb->prepare(“从患者_会话中选择Sum(到期),其中Type='Session'和Week(Date)='$i');
$temp=array();
$temp[]=数组('v'=>(字符串)$date\u display);
$temp[]=数组('v'=>(字符串)$sessions);
$rows[]=数组('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++;
}
$sessions=$wpdb->get_results($wpdb->prepare(“选择到期日期,患者_会话的日期,其中Type='Session'));
$work\u times=$wpdb->get\u results($wpdb->prepare(“选择金额,工作时间的日期”);
$expenses=$wpdb->get_results($wpdb->prepare(“选择金额,客户在接受心理治疗时的费用日期”);
$i=1;
而($isetISODate(2013,$i+1);
$date\u display=$week\u start->format('j M Y');
$session_总计=0;
$work\u time\u总计=0;
$expense_total=0;
foreach($sessions作为$session){
如果(日期(“W”,strottime($session->date))==i){
$session\u total=($session\u total+$session->Due);
}
}
foreach($work\u乘以$work\u时间){
如果(日期(“W”,标准时间($work\u time->date))=$i){
$work\U time\U total=($work\U time\U total+$work\U time->金额);
}
}
foreach($费用作为$费用){
如果(日期(“W”,标准时间($expense->date))=$i){
$expense\u total=($expense\u total+$expense->金额);
}
}
$balance=($session\u total+$work\u time\u total-$expense\u total);
$temp=array();
$temp[]=数组('v'=>(字符串)$date\u display);
$temp[]=数组('v'=>(字符串)$balance);
$rows[]=数组('c'=>$temp);
$i++;
}
默认值为0,即星期天,将其设置为1将是星期一、2星期二,依此类推

week(date,1);

要使其在代码中工作,您应该能够将查询更改为:

"SELECT Sum(Due) FROM patient_sessions WHERE Type='Session' AND Week(Date,1)=$i"
然而,我认为我可以更进一步,使用GROUPBY进行一次sql调用,然后迭代结果

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

或者,您可能需要使用WEEK(日期,2)取决于你想如何处理跨越几年的几周。

这似乎是一种效率极低的方法!只需一次点击获取所有结果,然后在结果集中迭代即可。@草莓你可能是对的。你的意思是使用“选择*来自患者会话”,然后使用循环遍历所有结果吗?我有e注意到图形加载速度很慢。大概这就是原因吧?通常情况下,PHP循环的运行速度会比我上面提到的使用查询的速度快吗?通常(当然也有例外),您希望尽可能少地往返数据库。您的策略为53次,我的策略为1次。但是,问题不在于“选择*”。而在于“WHERE Week(Date)='$i'”。请参见分组方式。@草莓谢谢-我已添加了修订后的代码(在上面的原始代码之后)这是我在收到您的第一个答复后想到的。它似乎比我以前的效率更高,但也许可以通过使用GROUP by来改进。我不确定是否有办法将3个foreach语句与if语句结合起来,我问了一个关于@gardni的问题“将此设置为1将是星期一,2个星期二”不正确。根据,一周的开始是星期天或星期一,区别在于如何确定一周是一年的一部分。否则,答案很好。
"SELECT Week(Date,1), SUM(DUE) FROM patient_sessions WHERE Type='Session' GROUP BY Week(Date,1)"