Autor | Zpráva | ||
---|---|---|---|
mackopu Profil |
#1 · Zasláno: 15. 9. 2006, 05:13:52
Mám databázi členů, ve které je datum narození ve formátu DATE. Potřebuji vypsat jméno, příjmení a datum narozenin člena, který má narozeniny v nejbližší budoucnosti. Zkusil jsem toto
SELECT jmeno, prijmeni, narozen FROM clenove WHERE substring(narozen, 6, 5) >= '09-15' ORDER BY narozen DESC LIMIT 1ale chová se to podivně. Jistě existuje lepší řešení; poradíte? |
||
ninja Profil |
#2 · Zasláno: 15. 9. 2006, 10:09:07
SELECT jmeno, prijmeni, narozen FROM clenove WHERE narozen >= CURDATE() ORDER BY narozen LIMIT 1
|
||
PP Profil * |
#3 · Zasláno: 15. 9. 2006, 10:13:20
Ten tvoj select nie je zly, ale databaza ho chape inac ako bol tvoj zamer. Musis pracovat s datumom ako datum a nie cislo alebo retazec.
Pokial chces interval pohraj sa s nasledujucimi prikazmi: narozen>DATE_SUB(NOW(),INTERVAL 5 DAY), resp. DATE_ADD(NOW(),INTERVAL 5 DAY) |
||
mackopu Profil |
#4 · Zasláno: 15. 9. 2006, 10:25:05
Tak už to funguje spolehlivě:
SELECT jmeno, prijmeni, narozenAle mám tu ještě jeden problém. Potřebuji získat počet dnů, které zbývají do narozenin. To by se pochopitelně dalo vyřešit takto: SELECT jmeno, prijmeni, narozen, DATEDIFF(NOW(),narozen) AS zbyva_dniMůj webosting ale má tak starou verzi MYSQL, že nepodporuje DATEDIFF(). Takže hledám způsob, jak počet dní zbývajících do narozenin zjistit čistým phpkem. Co vy na to? |
||
Kajman_ Profil * |
#5 · Zasláno: 15. 9. 2006, 11:26:25
Tak už to funguje spolehlivě
Myslím, že pro spolehlivitu bude třeba ještě ošetřit, aby to v prosinci umělo vrátit i narozeniny z ledna, února a tak. |
||
mackopu Profil |
#6 · Zasláno: 15. 9. 2006, 11:43:46
Kajman_ - A sakra, to je pravda! Já hlava děravá. Takže celé znova... Pomoc!
|
||
Joker Profil |
#7 · Zasláno: 15. 9. 2006, 12:13:06
Tak ale to poznáte, nevrátí se Vám totiž žádný řádek.
Takže uděláte: SELECT jmeno, prijmeni, narozen FROM clenove WHERE substring(narozen, 6, 5) >= '09-15' ORDER BY substring(narozen, 6, 5) LIMIT 1 a když nedostanete žádný řádek, nemá už do konce roku nikdo narozeniny. Pak má tedy nejdřív narozeniny ten, kdo je má jako první v roce, což zjistíte prostým vynecháním té WHERE podmínky z předchozího dotazu: SELECT jmeno, prijmeni, narozen FROM clenove ORDER BY substring(narozen, 6, 5) LIMIT 1 Možná bude existovat i jednodušší řešení |
||
mackopu Profil |
#8 · Zasláno: 15. 9. 2006, 12:42:33 · Upravil/a: mackopu
Joker - Velmi chytré ;-) A bez problému použitelné. Lámu si ale hlavu dál - čistě z principu - nad jediným dotazem, který by zvládl totéž, i když bude pravděpodobně hodně dlouhý a komplikovaný. Jde totiž ještě i o to, že kdybych potřeboval vypsat řekněme troje nejbližší narozeniny, které se budou pohybovat kolem konce roku (před a po), tak to nebude fungovat.
Zatím se podělím alespoň o řešení problému se dny zbývajícími do narozenin: $datum_naroz = str_replace(substr($zaznam["narozen"], 0, 4), Date("Y"), $zaznam["narozen"]); |
||
mackopu Profil |
#9 · Zasláno: 15. 9. 2006, 14:13:54 · Upravil/a: mackopu
UFFFFFFFF. Dotaz je to tedy mysteriózní, ale zdá se, že vychytává všechny požadavky. Funguje to následovně: Vygeneruje se nový sloupec nejblizsi_narozeniny. Podmínka zjistí, zda už minul měsíc narozenin. Pokud ne, je hodnotou datum narozenin v letošním roce, pokud ano, pak datum narozenin v roce příštím. Výsledek pak nechám seřadit vzestupně podle sloupce nejblizsi_narozeniny a limitem omezím libovolný počet. Hotovo, a navíc bez klauzule WHERE.
SELECT jmeno, prijmeni, narozen,Zbývá už jen zjistit, kolik zbývá dnů do narozenin a vypsat výstup. $zaznam = mysql_fetch_array($dotaz);Otestováno. Pokud někdo přijdete na zjednodušení budu rád. A díky všem. |
||
Časová prodleva: 5 dní
|
|||
mackopu Profil |
#10 · Zasláno: 20. 9. 2006, 13:20:13
Ještě lepší varianta dotazu:
SELECT jmeno, prijmeni, narozen, |
||
Časová prodleva: 18 let
|
Toto téma je uzamčeno. Odpověď nelze zaslat.
0