PHP循环月行,每周列

时间:2019-04-06 06:23:42

标签: php mysql

我正在建立一个包含以下几列的报告:月,出纳员,第1周,第2周,第3周,第4周和第5周,以及本月的总计。

  

我很难每周连续从数据库中汇总金额。

也许如果有人可以帮助我如何显示一个月的每个星期内的日期列表,可能会有所帮助!

这将显示每月每周的出纳员。

  

我不想每个出纳员每个月都对数据库的集合进行汇总。

Monthly Weekly Collection Table

数据库表

enter image description here

我的代码。

if($teller_cnt > 0) {
$new_start_week = 0;
$weeks_num = 5;

for($m = 1; $m<=12; $m++) {

    $weeks_num = weeks_num($m, $year);
    $num_of_weeks = $weeks_num;
    $monthname = date_formating($m, '!m', 'F');

    $total_per_month = 0;

    $min_1 = 0;
    if($m > 1) {
        if($num_of_weeks == 4) {
            $new_start_week = ($new_start_week + $weeks_num) + 1;
            $weeks_num = ($weeks_num + $new_start_week);
            $msg = '<span class="label label-danger">4 Months</span>';

        }else{
            $new_start_week = ($new_start_week + $weeks_num);
            $weeks_num = ($weeks_num + $new_start_week);
            $msg = '<span class="label label-info">5 Montsh</span>';
            $min_1 = -1;
        }
    }else{

        if($num_of_weeks == 4) {
            $msg = '<span class="label label-danger">4 Months</span>';
        }else{
            $msg = '<span class="label label-info">5 Montsh</span>';
        }
    }

    if(weeks_num(($m-1), $year)==4) {
        $weeks_num = $weeks_num - 1;
        $new_start_week = $new_start_week - 1;
    }

    echo '<tr>';
    echo '<td rowspan="'.($teller_cnt+1).'">';
    echo $monthname.' <br>';
    //echo 'Num of Weeks per month: '.$num_of_weeks. ' <br> ';
    //echo 'Start Of Week Num: ' . $new_start_week;
    //echo $msg . '<br>';
    echo '</td>';
    echo '</tr>';


    foreach ($qry_pay_tellers->result() as $row) {

        $qry_total_payapplied = $this->db->query("SELECT SUM(amt) + SUM(intrst) AS amt FROM payapplied WHERE teller = {$row->teller} AND YEAR(tdate) = $year AND MONTH(tdate) = $m")->row();

        $total_teller_amt = ($qry_total_payapplied) ? $qry_total_payapplied->amt : 0;

        echo '<tr>';
        echo '<td>' . $row->teller . '</td>';

        /*
        $firstDayOfMonth = new \DateTime("1st $monthname");
        $lastDayOfMonth = new \DateTime($firstDayOfMonth->format('t M Y'));
        $oneDay = new DateInterval('P1D');
        $period = new \DatePeriod($firstDayOfMonth, $oneDay, $lastDayOfMonth->add($oneDay));
        */

        $days_arr = array();

        $begin = new DateTime('2019-01-01');
        $end = new DateTime('2019-12-31');
        $interval = DateInterval::createFromDateString('1 day');
        $period = new DatePeriod($begin, $interval, $end);

        foreach($period as $date)
        {
            $dates = $date->format('Y-m-d');
            $week_num = $this->db->query("SELECT WEEK('$dates', 'Monday') AS weeknum;")->row();
            $days_arr[$week_num->weeknum][] = array('dayname' => $date->format('D'), 'date' =>  $dates);
            // echo $dates . ' - ' . $week_num->weeknum . '<br>';
        }

        for($w = $new_start_week; $w < $weeks_num; $w++) {
            echo '<td>';
            /*
            echo $w . '<br>';

            foreach($days_arr[$w] as $wrow) {
                echo $wrow['date'] . '<br>';
            }
            */
            echo '</td>';
        }
        //echo '<td class="number">'.number_format($total_teller_amt, 2).'</td>';

        if($num_of_weeks > 4) {
            echo '<td class="number">'.number_format($total_teller_amt, 2).'</td>';
        }else{
            echo '<td colspan="2" class="number">'.number_format($total_teller_amt, 2).'</td>';
        }


        echo '</tr>';

        $total_per_month += $total_teller_amt;

    }



    echo '<tr>';
    echo '<td class="number" colspan="8">'.number_format($total_per_month, 2).'</td>';
    echo '</tr>';
}
}

1 个答案:

答案 0 :(得分:1)

我的解决方案。

还是谢谢。

Weekly table

创建了从1月到12月的天数组,并确定其星期数。

$begin = new DateTime( '2019-01-01' );
$end = new DateTime( '2019-12-31' );
$end = $end->modify( '+1 day' );

$interval = new DateInterval('P1D');
$daterange = new DatePeriod($begin, $interval ,$end);

$dates_arr = array();
foreach($daterange as $date){

  $dates = $date->format('Y-m-d');
  $week_num = $this->db->query("SELECT WEEK('$dates', 'Monday') AS weeknum;")->row();

  $month_n = (int)$date->format('m');
  $dates_arr[$month_n][] = array(
      'week' => $week_num->weeknum,
      'dayname' => $date->format('D'),
      'dates' => $date->format('Y-m-d')
  );
}

然后创建一个表以对月和周编制索引并查询循环柜员

echo '<div class="row">';
echo '<div class="col-md-12">';
echo '<table class="table table-hover table-condensed table-bordered table-striped table-small">';
echo '<thead>';
echo '<th>Month</th>';
echo '<th>Teller</th>';
echo '<th>Week 1</th>';
echo '<th>Week 2</th>';
echo '<th>Week 3</th>';
echo '<th>Week 4</th>';
echo '<th>Week 5</th>';
echo '<th></th>';
echo '<th>Total</th>';
echo '</thead>';
echo '<tbody>';

for($month = 1; $month<=12; $month++) {
$total_per_month = 0;
$weeks_r = array();
foreach ($dates_arr[$month] as $rw) {
    $weeks_r[] = $rw['week'];
}
$u_week_r = array_unique($weeks_r);

$monthname = date_formating($month, '!m', 'F');

echo '<tr>';
echo '<td rowspan="' . ($teller_cnt + 1) . '">';
echo $monthname . ' <br>';
echo '</td>';
echo '</tr>';
$total_teller_amt = 0;
foreach ($qry_pay_tellers->result() as $row) {
    echo '<tr>';
    echo '<td>' . $row->teller . '</td>';
    foreach ($u_week_r as $wrow) {
        echo '<td class="number" style="font-size: 8px;">';
        $dates_arr_s = array();

        foreach ($dates_arr[$month] as $drow) {
            if ($drow['week'] == $wrow) {
                if(isWeekend($drow['dates']) == false) {
                    $dates_arr_s[] = $drow['dates'];
                    $qry_pay_applied_wamt = $this->db->query("
                        SELECT SUM(amt) + SUM(intrst) AS amt FROM payapplied WHERE teller = {$row->teller} AND CAST(tdate AS DATE) = '{$drow['dates']}'
                        ")
                        ->row();

                    $amt_per_week = ($qry_pay_applied_wamt) ? $qry_pay_applied_wamt->amt : 0;
                    $total_teller_amt += $amt_per_week;
                    echo '<span style="float: left !important;">'.$drow['dates'] . ' - ' . $drow['dayname'] . '</span><span class="pull-right">'.number_format($amt_per_week, 2).'</span><br>';
                }
            }
        }



        echo '</td>';
    }

    if(count($u_week_r) > 4) {
        if(count($u_week_r) > 5) {
            echo '<td class="number">' . number_format($total_teller_amt, 2) . '</td>';
        }else{
            echo '<td colspan="2" class="number">' . number_format($total_teller_amt, 2) . '</td>';
        }
    } else {
        echo '<td colspan="3" class="number">' . number_format($total_teller_amt, 2) . '</td>';
    }
    echo '</tr>';
    $total_per_month += $total_teller_amt;
}
echo '<tr>';
echo '<td class="number" colspan="9">'.number_format($total_per_month, 2).'</td>';
echo '</tr>';
}

echo '</tbody>';
echo '</table>';
echo '</div>';
echo '</div>';