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

C++ JAVA
Post Reply
User avatar
Ticketa
Турист
Турист
Posts: 390
Joined: Mon Feb 27, 2012 1:54 pm
Answers: 23
Location: in /root
Contact:

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

Post by Ticketa » Mon Mar 25, 2019 7:36 pm

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

Code: Select all

$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'

User avatar
Ticketa
Турист
Турист
Posts: 390
Joined: Mon Feb 27, 2012 1:54 pm
Answers: 23
Location: in /root
Contact:

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

Post by Ticketa » Tue Mar 26, 2019 7:41 pm

Опитвам й така:

Code: Select all

$td = strtotime&#40;date&#40;'01-m-Y'&#41;&#41;;
			$fd = strtotime&#40;" -12 month"&#41;;
			$cd = $fd;
			while&#40;$cd <= $td&#41; &#123;
				$c = date&#40;'m-Y', $cd&#41;;
				$d&#91;$c&#93; = 0;
				$cd = strtotime&#40;date&#40;'01-m-Y', $cd&#41;.' +1 month'&#41;;
			&#125;
			$qry = 'SELECT CONCAT&#40;LPAD&#40;EXTRACT&#40;MONTH FROM data&#41;, 2, "0"&#41;,".", EXTRACT&#40;YEAR FROM data&#41;&#41; col1, sum&#40;cash+bank&#41; as col2 FROM turnover
						WHERE data >= SUBDATE&#40;CURRENT_DATE, INTERVAL 12 MONTH&#41;
						GROUP BY 1';
			$res = $mysqli->query&#40;$qry&#41;;
			while&#40;$row = $res->fetch_assoc&#40;$res&#41;&#41; &#123;
				$total += $row&#91;'col2'&#93;;
				$d&#91;$row&#91;'col1'&#93;&#93; += $row&#91;'col2'&#93;;
			&#125;
	foreach&#40;$d as $c1 => $c2&#41; &#123;	
		echo '<tr>
					<td >'.$c1.'</td>
                    <td >'.number_format&#40;$c2, 2, '.', ''&#41;.'лв</td>
				</tr>';
	&#125;
Връща ми месеците правилно т.е. 01.03.2018 до 26.03.2019 , но с нулева стойност , а трябва да има стойност.

User avatar
anonimen
Web-tourist
Web-tourist
Posts: 1534
Joined: Mon Jun 11, 2012 6:07 pm
Answers: 163
Location: Parse error: unexpected "}" in /home/index.php on line 26

Post by anonimen » Tue Mar 26, 2019 8:37 pm

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

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

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

User avatar
Ticketa
Турист
Турист
Posts: 390
Joined: Mon Feb 27, 2012 1:54 pm
Answers: 23
Location: in /root
Contact:

Post by Ticketa » Tue Mar 26, 2019 11:16 pm

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

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

Благодаря за насоката, да си открия грешката.

User avatar
anonimen
Web-tourist
Web-tourist
Posts: 1534
Joined: Mon Jun 11, 2012 6:07 pm
Answers: 163
Location: Parse error: unexpected "}" in /home/index.php on line 26

Post by anonimen » Wed Mar 27, 2019 6:58 pm

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, защото сравнява лексикографски - т.е. първо сравнява месеца, а след това годината.

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

novakabg
Турист
Турист
Posts: 337
Joined: Fri May 13, 2016 12:29 pm
Contact:

Post by novakabg » Mon Apr 01, 2019 10:06 am

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

Code: Select all

date >= DATEADD&#40;month, -12, GETDATE&#40;&#41;&#41;

Code: Select all

date > DATEADD&#40;year,-1,GETDATE&#40;&#41;&#41;

Post Reply