#php #mysql
#php #mysql
Вопрос:
Я настраиваю отчет со следующими столбцами: месяц, Касса, Неделя 1, неделя 2, неделя 3, неделя 4 и неделя 5 и общая коллекция за месяц.
У меня возникают трудности с суммированием суммы из базы данных за каждую неделю строки.
Может быть, если кто-нибудь может мне помочь, как отобразить список дат в пределах каждой недели месяца, это было бы полезно!
Это покажет ежемесячную коллекцию кассиров.
Я не хочу еженедельно суммировать коллекцию из базы данных с каждого месяца. кассиры.
Таблица базы данных
Мой код.
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. Вы не сказали нам, что в данный момент делает ваш код или что происходит не так. Дайте нам подсказку, с чего начать. Спасибо.
2. Я сказал, что у меня возникают трудности с суммированием данных из базы данных в течение недели. Возможно, может помочь отображение всех дат каждую неделю. чтобы я мог подвести итог всем транзакциям в течение этих дат.
3. Да, вы это сказали … но «трудности» — это не постановка проблемы или описание поведения вашего кода. Если бы вы сказали врачу, что у вас возникли «трудности», как вы думаете, он смог бы поставить вам диагноз?
4. Я это исправил и добавил решение, спасибо за совет: D
Ответ №1:
Мое решение.
В любом случае спасибо.
Создал массив дней с января по декабрь и определил номера его недель.
$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>';