Autor | Zpráva | ||
---|---|---|---|
Andrej.B Profil |
#1 · Zasláno: 5. 12. 2021, 19:28:34
Zdravim,
potrebujem vypisat tyzden z datumu, ktory si generujem po Selecte z db. $datum_check = $row_datum_all['Datum']; $datumchange = date("d.m.Y", strtotime($datum_check)); $date = new DateTime($datumchange); $week = $date->format("W"); Pri vypise by som potreboval pri kazdom novom tyzdni, napisat, co je to za tyzden, vypisat datumy a dat novy riadok. Cize 46 tyzden - 15.11.2021, 16.11.2021<br> 47 tyzden - 23.11.2021, 25.11.2021<br> 48 tyzden - 3.12.2021<br> atd. Ako na logiku toho vypisu? Dakujem |
||
anonym_ Profil * |
#2 · Zasláno: 5. 12. 2021, 19:37:55
|
||
Andrej.B Profil |
#3 · Zasláno: 6. 12. 2021, 08:39:57
Diky,
zatial to mam takto: SELECT WEEK(Datum) as week, YEAR(Datum) as year FROM plan Group BY WEEK(Datum), YEAR(Datum) Order By YEAR(Datum), WEEK(Datum) while ($row_datum_all = $check_datum_all->fetch_array()) { $year = $row_datum_all['year']; $week = $row_datum_all['week']; $pamet = ''; $pamet2 = ''; if ($week != $pamet) { $pamet = $week; echo "<b>$pamet</b><br>"; } } 46 47 48 49 50 51 1 5 Ako do toho este zapracovat ten rok, aby to ukazovalo takto? 2021 46 47 48 49 50 51 2022 1 5 |
||
anonym_ Profil * |
#4 · Zasláno: 6. 12. 2021, 09:12:21
Andrej.B:
„Ako do toho este zapracovat ten rok, aby to ukazovalo takto?“ Úplně stejně, jako se pracuje s tím týdnem. Zkus se nad tím prosím trochu zamyslet. Celý ten okopírovaný kód z FAQ má 16 řádků, zkus je pochopit, co dělají a pak ty 3 řádky přidáš snadno sám. |
||
blaaablaaa Profil |
Andrej.B:
A ten skript ti aktuálně dělá to, co chceš? Podle ukázky ti jen vypíše týdny, ale už nevytahuje jednotlivé datumy, jak jsi chtěl v zadání. Navíc v tvém skriptu je následující část nesmyslná ($pamet u tebe bude vždy prázdný string, ta inicializace proměnné patří mimo cyklus). $pamet = ''; if ($week != $pamet) {..} |
||
Andrej.B Profil |
#6 · Zasláno: 6. 12. 2021, 10:03:46
blaaablaaa:
> A ten skript ti aktuálně dělá to, co chceš? Podle ukázky ti jen vypíše týdny, ale už nevytahuje jednotlivé datumy, jak jsi chtěl v zadání. > > Navíc v tvém skriptu je následující část nesmyslná ($pamet u tebe bude vždy prázdný string, ta inicializace proměnné patří mimo cyklus). Tak daleko som nepresiel. Chcel som tie tyzdne najskor, ze to bude v dalsom kroku v pohode, ale nieje. Pozeram, ze to musim najskor prejst ako rok... $q = " SELECT WEEK(Datum) as week, YEAR(Datum) as year, Datum FROM plan Group BY WEEK(Datum), YEAR(Datum) Order By YEAR(Datum), WEEK(Datum) "; $check_datum_all = $conn->query($q); echo $q.'<br>'; $pamet = ''; $pamet2 = ''; while ($row_datum_all = $check_datum_all->fetch_array()) { $datum_check = $row_datum_all['Datum']; $datumchange = date("d.m.Y", strtotime($datum_check)); $year = $row_datum_all['year']; $week = $row_datum_all['week']; if ($year != $pamet) { $pamet = $year; echo "<b>$pamet</b><br>"; } } Pravdepodobne nejako vnorene az k tym dnom? While year echo rok While week echo week While day echo day Ale takto v jednom mi to pride, ze musim mat 3 krat Select na DB, podla year, week a nakoniec day. Alebo to zle chapem. A nakoniec poskladat year 2021 week 46 day 2021-11-16 week 47 2021-11-22 2021-11-23 week 48 2021-11-29 2021-11-30 2021-12-04 week49 Atd 50 51 year 2022 1 atd 5 2022-02-01 prilis tazke na mna. |
||
blaaablaaa Profil |
Nedoporučuji používat v dotazech klíčová slova jako názvy položek (year, week, ...), taky není dobré míchat češtinu a angličtinu, rozhodni se pro jedno a to používej. V kódu správně odsazuj (nebo to nech na IDE - které ti samo kód naformátuje).
Není třeba GROUPovat - chceš vypsat všechny (stačí si dotaz spustit v nějakém GUI - adminer/phpmyadmin/..., abys viděl výsledek). Taky není třeba řadit podle roku a týdne, seřaď to přímo podle data. $q = "SELECT WEEK(Datum) AS plan_week, YEAR(Datum) AS plan_year, Datum AS plan_date FROM plan ORDER BY plan_date"; V PHP pak stačí jeden cyklus: $year_actual = null; //tady si ulozis aktualni rok v cyklu $week_actual = null; //tady si ulozis aktualni tyden v cyklu while ( $row_datum_all = $check_datum_all->fetch_array() ) { $date_change = date("d.m.Y", strtotime($row_datum_all['plan_date'])); $year = $row_datum_all['plan_year']; $week = $row_datum_all['plan_week']; if ( $year !== $year_actual ) { if ( $year_actual ) { echo '<br>'; //radek nad rokem, ale pouze u 2. a dalsiho roku ve vypise } echo "<b>$year</b><br>"; $year_actual = $year; } if ( $week !== $week_actual ) { echo "<b>$week</b><br>"; $week_actual = $week; } echo $date_change.'<br>'; } |
||
anonym_ Profil * |
#8 · Zasláno: 6. 12. 2021, 10:34:55
Andrej.B:
„Ale takto v jednom mi to pride, ze musim mat 3 krat Select na DB, podla year, week a nakoniec day. Alebo to zle chapem.“ Ne, bude tam jeden dotaz na DB, jeden cyklus a budeš si pamatovat a porovnávat 3 různé proměnné (v ukázkovém kódu je jedna nazvaná $pamet. Ty budeš mít $lastYear , $lastWeek , $lastDay a porovnávat s rokem/týdnem/dnem, který má aktuálně procházený řádek z databáze. Podle toho se rozhodneš, jestli (a jakou) hlavičku vypíšeš, nebo jestli vypíšeš jen ten záznam.
|
||
Andrej.B Profil |
Toto je jedine co ma napadlo, na 3 krat select.
$q_year = " SELECT YEAR(Datum) as year FROM plan Group BY YEAR(Datum) Order By YEAR(Datum) "; $check_datum_year = $conn->query($q_year); //echo $q_year.'<br>'; while ($row_datum_year = $check_datum_year->fetch_array()) { echo $row_datum_year['year']; echo '<br>'; $q_week = " SELECT WEEK(Datum) as week FROM plan WHERE YEAR(Datum) = '".$row_datum_year['year']."' Group BY WEEK(Datum) Order By WEEK(Datum) "; $check_datum_week = $conn->query($q_week); //echo $q_week.'<br>'; while ($row_datum_week = $check_datum_week->fetch_array()) { echo $row_datum_week['week']; echo '<br>'; $q_day = " SELECT Datum as day FROM plan WHERE WEEK(Datum) = '".$row_datum_week['week']."' Group BY day Order By day "; $check_datum_day = $conn->query($q_day); //echo $q_day.'<br>'; while ($row_datum_day = $check_datum_day->fetch_array()) { echo $row_datum_day['day']; echo '<br>'; } } } uf pozeram, ze tu pribudli prispevky. Idem pozriet, dakujem. |
||
Andrej.B Profil |
#10 · Zasláno: 6. 12. 2021, 11:54:47
Vypada to super. Dakujem.
Ak sa to dobre pochopil, tak v cykle ide vzdy: cyklus plan_year plan_week plan_date 1 2021 46 2021-11-16 2 2021 47 2021-11-22 3 2021 47 2021-11-23 4 2021 47 2021-11-24 5 2021 47 2021-11-25 6 2021 47 2021-11-26 7 2021 47 2021-11-27 8 2021 48 2021-11-28 9 2021 48 2021-11-29 Atd a vzdy pozrie, ci je splnena podmienka v tom IF a podla toho zobrazi.. |
||
anonym_ Profil * |
#11 · Zasláno: 6. 12. 2021, 11:57:49
Andrej.B:
Ano. Ale to se dá snadno ověřit tím, že si ty proměnné před tou podmínkou vypíšeš a uvidíš, co v nich je/není. |
||
Andrej.B Profil |
#12 · Zasláno: 6. 12. 2021, 12:27:01
anonym:
dava mi to konecne zmysel. je to aj cistejsie. Dal som si aj test na cas, ale priemer s 30 cyklov to mam 0.021s /1 select/ vs 0.025s /3 select/ . Super, blaaablaaa a anonym dakujem. Vzdy sa tu pomoze. |
||
Andrej.B Profil |
#13 · Zasláno: 6. 12. 2021, 15:12:56
a ako to vypada v praxi. Diky este raz
![]() |
||
Andrej.B Profil |
#14 · Zasláno: 7. 12. 2021, 10:30:57
blaaablaaa:
„ $q = "SELECT WEEK(Datum) AS plan_week, YEAR(Datum) AS plan_year, Datum AS plan_date FROM plan ORDER BY plan_date"; “
Ak by to niekto potreboval, tak toto ukazuje start tyzdna ako Nedela. Staci si potom upravit WEEK(Datum) na WEEK(Datum,1) , kde 1 znamena pondelok ako zaciatok tyzdna, defualtne je to 0 a teda Nedela. |
||
Časová prodleva: 4 roky
|
0