Autor | Zpráva | ||
---|---|---|---|
smiesek Profil |
Ukládám data osob do následujících sloupců tabulky:
Sloupce: jmeno, prijmeni, narozen (typ DATE) Tabulka: osoba Ráda bych nyní vypisoval pomocí SQL dotazu 3 nejbližší osoby, které budou mít narozeniny k aktuálnímu datu. Dotaz, který jsem dohledat a snažil se sestavit je následující: SELECT jmeno, prijmeni, narozen, FLOOR(DATEDIFF(NOW(),narozen)/365.25) AS vek FROM osoba ORDER BY MONTH(narozen) ASC, DAY(narozen) ASC, YEAR(narozen) ASC LIMIT 3 Věk mi to sice vypočítá - nevím tedy do jaké míry bez chyby nepřesnosti, ale nemohu přijít na to, od dnešního data. Určitě se tam bude pracovat s podmínkou narozen='GETDATE()' což je pro dnešní den, ale ještě k tomu podmínku pro nejbližších 7 dní (týden) a nebo třeba v aktuálním měsíci |
||
Keeehi Profil |
#2 · Zasláno: 8. 5. 2016, 10:36:57
SELECT jmeno, prijmeni, narozen, FLOOR(DATEDIFF(NOW(),narozen)/365.25) AS vek FROM osoba ORDER BY MONTH(NOW())*100+DAY(NOW()) > MONTH(narozen)*100 + DAY(narozen), MONTH(narozen), DAY(narozen), YEAR(narozen) LIMIT 3 |
||
smiesek Profil |
#3 · Zasláno: 8. 5. 2016, 19:05:00
Keeehi:
Děkuju, jaká podmínka nebo pod jakým prosím klíčovým slovem mám ještě hledat podmínku, aby se vypisovaly záznamy týden dopředu? od aktuálního data? Jestli můžete prosím napovědět, že bych se pokusila sama implementovat. Příklad: k dnešnímu datu (8.5.) aby to vypsalo pouze max. týden (resp. 7 dní) nejbližší narozeniny. |
||
Kajman Profil |
#4 · Zasláno: 8. 5. 2016, 21:39:10
Ukázka omezení je např. tady
Upozornění na narozeniny v SQL Stačí přidat order by a limit 3, pokud se nemají vypsat všechny v nejbližších 7 dnech. |
||
smiesek Profil |
Kajman:
ano podmínku pro řazení a limit mám napsanou, ale nevím jak do WHERE zaimplementovat ten výpis v následujích x dní? Má podoba podmínky WHERE je následující: WHERE MONTH(narozen)>=MONTH(NOW()) AND DAYOFMONTH(narozen)>=DAYOFMONTH(NOW()) právě možná proto by byl lepší se i vyhnout té podmínce s limitem, protože co když bude 5 osob se stejným datem narozenin, tak mi to vypíše pouze 3... |
||
TomášK Profil |
#6 · Zasláno: 9. 5. 2016, 09:08:36
Zkus následující (netestoval jsem to):
SELECT jmeno, prijmeni, narozen, TIMESTAMPDIFF(YEAR, narozen, CURDATE()) AS vek FROM osoba WHERE DATE_ADD( narozen, INTERVAL TIMESTAMPDIFF(YEAR, narozen, CURDATE()) YEAR ) BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 7 DAY) |
||
Kajman Profil |
#7 · Zasláno: 9. 5. 2016, 10:25:38
smiesek:
Pokud nechcete limit na počet položek, tak jen použijete dotaz z odkazu, stačí změnit HAVING narozeniny_za BETWEEN 0 AND 14 HAVING narozeniny_za BETWEEN 0 AND 6 TomášK: K výpočtu věku by se neměl asi brát aktuální den, ale přičíst těch 7 dní, jinak ta podmínka ve where bude hledat loňské narozeniny a ty nebudou odpovídat between podmínce. |
||
smiesek Profil |
#8 · Zasláno: 9. 5. 2016, 17:25:28
děkuju za rady a zkusím to nějak zapracovat, zřejmě nechám výpis třeba prvních 6 záznamů v nejbližších 7 dnech.
|
||
smiesek Profil |
Kajman:
„dotaz z odkazu“ chápu však správně, že nelze použít HAVING a LIMIT současně? Lze nějak ještě ten HAVING omezit na první třeba 3 záznamy? --- Jo tak lze použít, špatně jsem to vkládala :-) |
||
Časová prodleva: 16 dní
|
|||
smiesek Profil |
můžete mi poradit jak vhodně upravit podmínku where
WHERE MONTH(narozen)>=MONTH(NOW()) AND DAYOFMONTH(narozen)>=DAYOFMONTH(NOW()) která mi v tomto případě vypisuje např. k dnešnímu datu: - 27.5. - 28.6. - 29.6. ... že to nebere i data jako 1.6. ale vždy ty aktuální kolem aktuálního DNE :( |
||
Kajman Profil |
Spíše máte špatně řazení.
Edit. Tedy ta podmínka je také špatně, je lepší to zahodit a použít např. to řešení z odkazu... SELECT jmeno, prijmeni, narozen, Concat(Year('2016-05-27') + IF(Substr(narozen, 5) < Substr('2016-05-27', 5), 1, 0), Substr( narozen, 5)) AS narozeniny FROM osoba ORDER BY narozeniny LIMIT 3 |
||
smiesek Profil |
no, ale jak tomu dát ještě podmínku, aby se vypisovalo pouze 3 záznamy a k tomu pouze týden dopředu?
potřebuju to upravit pro následující, co mi nefunguje SELECT jmeno, prijmeni, narozen, MONTH(narozen) AS mesic, DAYOFMONTH(narozen) AS den, FLOOR(DATEDIFF(NOW(),narozen)/365.25)+1 AS vek, DATEDIFF(CONCAT(YEAR(CURDATE()) + IF(SUBSTR(narozen, 5) < SUBSTR(CURDATE(), 5), 1, 0), SUBSTR(narozen, 5)), CURDATE()) AS narozeniny_za FROM osoba WHERE MONTH(narozen)>=MONTH(NOW()) AND DAYOFMONTH(narozen)>=DAYOFMONTH(NOW()) HAVING narozeniny_za BETWEEN 0 AND 7 ORDER BY MONTH(narozen) ASC, DAYOFMONTH(narozen) ASC, YEAR(narozen) ASC LIMIT 3 |
||
Časová prodleva: 9 let
|
0