- Изваждане последните 12 месеца и общата им сума
WT форуми -> PHP MySQL ASP.NET -> Изваждане последните 12 месеца и общата им сума
Създайте нова тема Напишете отговор 
Автор Съобщение
Ticketa
Турист
Турист

Регистриран на: 27/02/2012 3:54 pm

Support: 23
Bonus: 46
Мнения: 319
Мнение 25/03/2019 9:36 pm     Изваждане последните 12 месеца и общата им сума Отговорете с цитат


Искам да изведа за последните 12 месеца общата сума(сумирана) записана в базата дани, като използвам следния PHP

$i = 12;
while ($i > 0) {
   $ym .= "`month`='".@date('01-m-Y', strtotime("-$i month"))."' and ";
   //$yms[$ym] = $ym;
   $i--;
}
echo 'select count(cash) as sumcash FROM turnover WHERE '.$ym.';';


Извеждам следния резултат:

select sum(cash) as sumcash FROM turnover WHERE `month`='01-03-2018' and `month`='01-04-2018' and `month`='01-05-2018' and `month`='01-06-2018' and `month`='01-07-2018' and `month`='01-08-2018' and `month`='01-09-2018' and `month`='01-10-2018' and `month`='01-11-2018' and `month`='01-12-2018' and `month`='01-01-2019' and `month`='01-02-2019' AND


Реално самият код сам по себе си - не работи. Не ми сумира всеки един ден/месец в обща сума. Трябва да изведа например тотал: 30,000$ .. а то извежда 1,500$ й то ... ако махна думичката AND в края. Някакви предложения? Опитах различни варианти от stackover - но без резултат.


Опитах и чрез заявка:
SQL code:
SELECT SUM(cash) as countcash FROM turnover 
WHERE data < Now() and data > DATE_ADD(Now(), INTERVAL- 12 MONTH);


Обаче, отново не сработва. Дата ми е записана в колона "data" - "ден-месец-година"

SQL code:
SELECT SUM(cash) as countcash FROM turnover WHERE data BETWEEN CURDATE() - INTERVAL 12 MONTH AND CURDATE();


SQL code:
SELECT MONTH(month) AS MONTH, ROUND(SUM(cash)) AS TOTAL_PTS FROM turnover WHERE MONTH(month) BETWEEN MONTH(CURDATE() - INTERVAL 12 MONTH) AND MONTH(CURDATE()) GROUP BY MONTH 



SQL code:
SELECT data, ROUND(SUM(cash)) as cashsum FROM turnover WHERE data <= DATE_FORMAT(CURDATE(), '01-%m-%Y') AND data >= DATE_FORMAT(CURDATE(), '01-%m-%Y') - INTERVAL 6 MONTH 


Warning: #1292 Incorrect datetime value: '01-03-2019'
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Ticketa
Турист
Турист

Регистриран на: 27/02/2012 3:54 pm

Support: 23
Bonus: 46
Мнения: 319
Мнение 26/03/2019 9:41 pm     Re: Изваждане последните 12 месеца и общата им сума Отговорете с цитат


Опитвам й така:
$td = strtotime(date('01-m-Y'));
         $fd = strtotime(" -12 month");
         $cd = $fd;
         while($cd <= $td) {
            $c = date('m-Y', $cd);
            $d[$c] = 0;
            $cd = strtotime(date('01-m-Y', $cd).' +1 month');
         }
         $qry = 'SELECT CONCAT(LPAD(EXTRACT(MONTH FROM data), 2, "0"),".", EXTRACT(YEAR FROM data)) col1, sum(cash+bank) as col2 FROM turnover
                  WHERE data >= SUBDATE(CURRENT_DATE, INTERVAL 12 MONTH)
                  GROUP BY 1';
         $res = $mysqli->query($qry);
         while($row = $res->fetch_assoc($res)) {
            $total += $row['col2'];
            $d[$row['col1']] += $row['col2'];
         }
   foreach($d as $c1 => $c2) {   
      echo '<tr>
               <td >'.$c1.'</td>
                    <td >'.number_format($c2, 2, '.', '').'лв</td>
            </tr>';
   }


Връща ми месеците правилно т.е. 01.03.2018 до 26.03.2019 , но с нулева стойност , а трябва да има стойност.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
anonimen
Активен
Активен

Регистриран на: 11/06/2012 8:07 pm

Support: 160
Bonus: 319
Мнения: 1496
Мнение 26/03/2019 10:37 pm      Отговорете с цитат


Първата ти заявка изглежда най-валидна:

SQL code:
SELECT SUM(cash) as countcash FROM turnover 
WHERE data < Now() and data > DATE_ADD(Now(), INTERVAL- 12 MONTH);


Ако вместо общата сума го пуснеш да изкара всичко (с астериск *), виждаш ли правилните резултати? Ако не - обърни внимание какво липсва и какво е излишно, за да видим как да се оправи.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Ticketa
Турист
Турист

Регистриран на: 27/02/2012 3:54 pm

Support: 23
Bonus: 46
Мнения: 319
Мнение 27/03/2019 1:16 am      Отговорете с цитат


anonimen написа:
Първата ти заявка изглежда най-валидна:

SQL code:
SELECT SUM(cash) as countcash FROM turnover 
WHERE data < Now() and data > DATE_ADD(Now(), INTERVAL- 12 MONTH);


излиза:
SQL code:
Warning: #1292 Incorrect datetime value: '02-01-2018'
Warning: #1292 Incorrect datetime value: '02-01-2018'
Warning: #1292 Incorrect datetime value: '03-01-2018'
Warning: #1292 Incorrect datetime value: '03-01-2018'
Warning: #1292 Incorrect datetime value: '04-01-2018'
Warning: #1292 Incorrect datetime value: '04-01-2018'
Warning: #1292 Incorrect datetime value: '05-01-2018'
Warning: #1292 Incorrect datetime value: '05-01-2018'
Warning: #1292 Incorrect datetime value: '06-01-2018'
Warning: #1292 Incorrect datetime value: '06-01-2018'
Warning: #1292 Incorrect datetime value: '08-01-2018'
Warning: #1292 Incorrect datetime value: '08-01-2018'
Warning: #1292 Incorrect datetime value: '09-01-2018'
Warning: #1292 Incorrect datetime value: '09-01-2018'
Warning: #1292 Incorrect datetime value: '10-01-2018'
Warning: #1292 Incorrect datetime value: '10-01-2018'
Warning: #1292 Incorrect datetime value: '11-01-2018'
Warning: #1292 Incorrect datetime value: '11-01-2018'
Warning: #1292 Incorrect datetime value: '12-01-2018'
Warning: #1292 Incorrect datetime value: '12-01-2018'
Warning: #1292 Incorrect datetime value: '13-01-2018'
Warning: #1292 Incorrect datetime value: '13-01-2018'
Warning: #1292 Incorrect datetime value: '15-01-2018'
Warning: #1292 Incorrect datetime value: '15-01-2018'
Warning: #1292 Incorrect datetime value: '16-01-2018'
Warning: #1292 Incorrect datetime value: '16-01-2018'
Warning: #1292 Incorrect datetime value: '17-01-2018'
Warning: #1292 Incorrect datetime value: '17-01-2018'
Warning: #1292 Incorrect datetime value: '18-01-2018'
Warning: #1292 Incorrect datetime value: '18-01-2018'
Warning: #1292 Incorrect datetime value: '19-01-2018'
Warning: #1292 Incorrect datetime value: '19-01-2018'
Warning: #1292 Incorrect datetime value: '20-01-2018'
Warning: #1292 Incorrect datetime value: '20-01-2018'
Warning: #1292 Incorrect datetime value: '22-01-2018'
Warning: #1292 Incorrect datetime value: '22-01-2018'
Warning: #1292 Incorrect datetime value: '23-01-2018'
Warning: #1292 Incorrect datetime value: '23-01-2018'
Warning: #1292 Incorrect datetime value: '24-01-2018'
Warning: #1292 Incorrect datetime value: '24-01-2018'
Warning: #1292 Incorrect datetime value: '25-01-2018'
Warning: #1292 Incorrect datetime value: '25-01-2018'
Warning: #1292 Incorrect datetime value: '26-01-2018'
Warning: #1292 Incorrect datetime value: '26-01-2018'
Warning: #1292 Incorrect datetime value: '27-01-2018'
Warning: #1292 Incorrect datetime value: '27-01-2018'
Warning: #1292 Incorrect datetime value: '29-01-2018'
Warning: #1292 Incorrect datetime value: '29-01-2018'
Warning: #1292 Incorrect datetime value: '30-01-2018'
Warning: #1292 Incorrect datetime value: '30-01-2018'
Warning: #1292 Incorrect datetime value: '31-01-2018'
Warning: #1292 Incorrect datetime value: '31-01-2018'
Warning: #1292 Incorrect datetime value: '01-02-2018'
Warning: #1292 Incorrect datetime value: '01-02-2018'
Warning: #1292 Incorrect datetime value: '02-02-2018'
Warning: #1292 Incorrect datetime value: '02-02-2018'
Warning: #1292 Incorrect datetime value: '03-02-2018'
Warning: #1292 Incorrect datetime value: '03-02-2018'
Warning: #1292 Incorrect datetime value: '05-02-2018'
Warning: #1292 Incorrect datetime value: '05-02-2018'
Warning: #1292 Incorrect datetime value: '06-02-2018'
Warning: #1292 Incorrect datetime value: '06-02-2018'
Warning: #1292 Incorrect datetime value: '07-02-2018'
Warning: #1292 Incorrect datetime value: '07-02-2018'
Open new phpMyAdmin window




Цитат:

Ако вместо общата сума го пуснеш да изкара всичко (с астериск *), виждаш ли правилните резултати? Ако не - обърни внимание какво липсва и какво е излишно, за да видим как да се оправи.




MySQL returned an empty result set (i.e. zero rows). (Query took 0.0007 seconds.)
SQL code:
SELECT * FROM turnover WHERE data < Now() and data > DATE_ADD(Now(), INTERVAL- 12 MONTH)








Така:
SQL code:
 
SELECT * FROM turnover WHERE data > DATE_ADD(Now(), INTERVAL- 12 MONTH)
MySQL returned an empty result set (i.e. zero rows). (Query took 0.0005 seconds.)

Обаче, ако използвам:
SQL code:

SELECT * FROM turnover WHERE data < Now()

Showing rows 0 - 24 (370 total, Query took 0.0004 seconds.)
Връща 370 резултата.

"Бъгва" се при използването на: data > DATE_ADD(Now(), INTERVAL -12 MONTH)

В колоната `data` записите са по следния начин: 02-01-2018 (ден-месец-година)


ЕДИТ:
SQL code:
SELECT SUM(cash) as countcash FROM turnover WHERE data < Now() and data > DATE_FORMAT(DATE_ADD(Now(),INTERVAL -12 MONTH), '01-%m-%Y') 


Вкарах корекция на формата и извлякох резултатите.

Showing rows 0 - 0 (1 total, Query took 0.0279 seconds.)
SQL code:
SELECT SUM(cash) as countcash FROM turnover WHERE data < Now() and data > DATE_FORMAT(DATE_ADD(Now(),INTERVAL -12 MONTH), '01-%m-%Y') 



В този случай, имаме работеща заявка , но тя връща до месец 02-01-2018 (януари 2018) вместо до месец 01-03-2018(март 2018))

SELECT DATE_FORMAT(DATE_ADD(Now(),INTERVAL -12 MONTH), '01-%m-%Y') ==връща=== 01-03-2018
SELECT now() ==връща== 2019-03-27 01:31:47






ЕДИТ ПОСЛЕДЕН: Работещата заявка е тази:
SQL code:
SELECT SUM(cash+bank) FROM turnover WHERE data < DATE_FORMAT(Now(), '%d-%m-%Y') and data > DATE_FORMAT(DATE_ADD(Now(),INTERVAL -12 MONTH), '01-%m-%Y') 


Благодаря за насоката, да си открия грешката.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
anonimen
Активен
Активен

Регистриран на: 11/06/2012 8:07 pm

Support: 160
Bonus: 319
Мнения: 1496
Мнение 27/03/2019 8:58 pm      Отговорете с цитат


Цитат:
Warning: #1292 Incorrect datetime value: '29-01-2018'


Като гледам грешката, започвам да се питам дали полето ти случайно не е стрингов тип (CHAR/VARCHAR/etc…), вместо датов(DATE/DATETIME/etc…)?

SQL code:
SELECT SUM(cash+bank) FROM turnover WHERE data < DATE_FORMAT(Now(), '%d-%m-%Y') and data > DATE_FORMAT(DATE_ADD(Now(),INTERVAL -12 MONTH), '01-%m-%Y') 


Защото тия DATE_FORMATи връщат стрингове, в които месецът е преди годината, и е силно подозирам, че mysql ще ги сравнява именно като стрингове, вместо като дати. Което може да доведе до странни бъгове от рода 01-01-2100 < 01-12-1900, защото сравнява лексикографски - т.е. първо сравнява месеца, а след това годината.

Провери си за всеки случай полето, както и дали този бъг се появява ^, за да няма неприятни изненади от неочаквани ситуации.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
novakabg
Турист
Турист

Регистриран на: 13/05/2016 2:29 pm

Support: 5
Bonus: 10
Мнения: 337
Мнение 01/04/2019 12:06 pm      Отговорете с цитат


Така става ли?

date >= DATEADD(month, -12, GETDATE())


date > DATEADD(year,-1,GETDATE())
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Покажи мнения от преди:    
Създайте нова тема   Напишете отговор    web-tourist.net Форуми -> PHP MySQL ASP.NET Часовете са според зоната GMT + 2 Часа
Страница 1 от 1


 
Идете на:  
Не Можете да пускате нови теми
Не Можете да отговаряте на темите
Не Можете да променяте съобщенията си
Не Можете да изтривате съобщенията си
Не Можете да гласувате в анкети