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
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
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
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
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
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
za
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
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 :-)
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

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0