【问题标题】:How do I set first day of the week to Monday when using Week(Date) in PHP/MySQL?在 PHP/MySQL 中使用 Week(Date) 时,如何将一周的第一天设置为星期一?
【发布时间】:2013-04-24 15:56:06
【问题描述】:

我正在使用以下代码构建一个 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++;
    }

修订代码

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

【问题讨论】:

  • 这似乎是一种非常低效的方法!只需一次获取所有结果,然后遍历结果集。
  • @Strawberry 你可能是对的。你的意思是使用'SELECT * from patient_sessions'然后使用循环来遍历所有结果吗?我注意到图表加载速度很慢。想必这是为什么?通常情况下,PHP 循环会比我上面使用的查询更快地工作吗?
  • 通常(当然也有例外),您希望尽可能少地往返数据库。您的策略进行了 53 次行程。我的是 1。但是,问题不在于“SELECT *”。它与“WHERE Week(Date)='$i'”有关。请参阅分组依据。
  • @Strawberry 谢谢 - 我在收到您的第一个回复后添加了修改后的代码(在上面的原始代码之后)。它似乎比我以前的效率更高,但也许可以通过使用 GROUP BY 来改进。我不确定是否有办法将 3 个 foreach 语句与 if 语句结合起来,我问了一个关于这个 here 的问题

标签: php mysql date week-number


【解决方案1】:
WEEK(date[mode]); 

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

默认参数是 0,即星期日,设置为 1 将是星期一,2 星期二,依此类推。

week(date,1);

【讨论】:

  • @gardni“将其设置为 1 将是星期一,2 星期二”是不正确的。根据documentation,一周的开始是星期日或星期一,不同之处在于如何将一周确定为一年的一部分。否则,很好的答案。
【解决方案2】:

为了让它在您的代码中工作,您应该能够将查询更改为:

"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(Date,2),具体取决于您希望如何处理跨年的周。

【讨论】:

    猜你喜欢
    • 2015-12-11
    • 2013-11-30
    • 2020-01-18
    • 1970-01-01
    • 2019-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多