Изваждане последните 12 месеца и общата им сума

Ticketa

Registered
Искам да изведа за последните 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]SELECT SUM(cash) as countcash FROM turnover
WHERE data < Now() and data > DATE_ADD(Now(), INTERVAL- 12 MONTH);[/sql]

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

[sql]SELECT SUM(cash) as countcash FROM turnover WHERE data BETWEEN CURDATE() - INTERVAL 12 MONTH AND CURDATE();[/sql]

[sql]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]


[sql]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 [/sql]

Warning: #1292 Incorrect datetime value: '01-03-2019'
 
Опитвам й така:
Код:
$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 , но с нулева стойност , а трябва да има стойност.
 
Първата ти заявка изглежда най-валидна:

[sql]SELECT SUM(cash) as countcash FROM turnover
WHERE data < Now() and data > DATE_ADD(Now(), INTERVAL- 12 MONTH);
[/sql]

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

[sql]SELECT SUM(cash) as countcash FROM turnover
WHERE data < Now() and data > DATE_ADD(Now(), INTERVAL- 12 MONTH);
[/sql]
излиза:
[sql]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[/sql]



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



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







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

Обаче, ако използвам:
[sql]
SELECT * FROM turnover WHERE data < Now() [/sql]
Showing rows 0 - 24 (370 total, Query took 0.0004 seconds.)
Връща 370 резултата.

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

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


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

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

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


В този случай, имаме работеща заявка , но тя връща до месец 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]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') [/sql]

Благодаря за насоката, да си открия грешката.
 
Warning: #1292 Incorrect datetime value: '29-01-2018'

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

[sql]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')
[/sql]

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

Провери си за всеки случай полето, както и дали този бъг се появява ^, за да няма неприятни изненади от неочаквани ситуации.
 

Горе