Autor Zpráva
mackopu
Profil
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 1
ale chová se to podivně. Jistě existuje lepší řešení; poradíte?
ninja
Profil
SELECT jmeno, prijmeni, narozen FROM clenove WHERE narozen >= CURDATE() ORDER BY narozen LIMIT 1
PP
Profil *
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
Tak už to funguje spolehlivě:
SELECT jmeno, prijmeni, narozen 

FROM clenove
WHERE substring(narozen, 6, 5) >= '09-15'
ORDER BY substring(narozen, 6, 5) LIMIT 1
Ale 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_dni 

FROM clenove
WHERE substring(narozen, 6, 5) >= '09-15'
ORDER BY substring(narozen, 6, 5) LIMIT 1
Mů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 *
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
Kajman_ - A sakra, to je pravda! Já hlava děravá. Takže celé znova... Pomoc!
Joker
Profil
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
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"]);

$datum_naroz = strtotime($datum_naroz);
$datum_dnes = strtotime(Date("Y-m-d"));
$rozdil = $datum_naroz - $datum_dnes;
$zbyva_dni = round($rozdil / 86400);
switch($zbyva_dni):
case 0: $zbyva_dni = "A to je právě dnes. Blahopřejeme!"; break;
case 1: $zbyva_dni = "A to je už zítra!"; break;
case 2: $zbyva_dni = "A to je už pozítří!"; break;
case 3: $zbyva_dni = "A to je za ".$zbyva_dni." dny"; break;
case 4: $zbyva_dni = "A to je za ".$zbyva_dni." dny"; break;
default: $zbyva_dni = "A to je za ".$zbyva_dni." dní";
endswitch;

echo $zbyva_dni;
mackopu
Profil
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,

REPLACE (narozen, SUBSTRING(narozen, 1, 4), DATE_FORMAT(CURDATE(), IF(SUBSTRING(narozen, 6, 2) < DATE_FORMAT(CURDATE(), '%m'), DATE_FORMAT(DATE_ADD(CURDATE(), INTERVAL 1 YEAR), '%Y'), '%Y'))) AS nejblizsi_narozeniny
FROM clenove
ORDER BY nejblizsi_narozeniny
LIMIT 1
Zbývá už jen zjistit, kolik zbývá dnů do narozenin a vypsat výstup.
$zaznam = mysql_fetch_array($dotaz);

$narozen_oslavence = Date("d.m.", strtotime($zaznam["narozen"]));
$narozen_oslavence_rok = Date("Y", strtotime($zaznam["narozen"]));
$narozen_oslavence_cele = Date("d.m.Y", strtotime($zaznam["narozen"]));
$jmeno_oslavence = $zaznam["jmeno"];
$prijmeni_oslavence = $zaznam["prijmeni"];
$nejblizsi_narozeniny = $zaznam["nejblizsi_narozeniny"];

$datum_naroz = strtotime($nejblizsi_narozeniny);
$datum_dnes = strtotime(Date("Y-m-d"));
$rozdil = $datum_naroz - $datum_dnes;
$zbyva_dni = round($rozdil / 86400);
switch($zbyva_dni):
case 0: $zbyva_dni = "A to je právě dnes. Blahopřejeme!"; break;
case 1: $zbyva_dni = "A to je už zítra!"; break;
case 2: $zbyva_dni = "A to je už pozítří!"; break;
case 3: $zbyva_dni = "A to je za ".$zbyva_dni." dny"; break;
case 4: $zbyva_dni = "A to je za ".$zbyva_dni." dny"; break;
default: $zbyva_dni = "A to je za ".$zbyva_dni." dní";
endswitch;

function UrciVek($narozen)
{
list($den,$mesic,$rok)=explode(".",$narozen);
$vek = strVal((Time()-mktime(0,0,0,$mesic,$den,$rok))/31536000);
$vek = Floor($vek);
return $vek+1; // připočtu rok k jeho současnému věku
};

echo "Nejbližší narozeniny: ".$jmeno_oslavence." ".$prijmeni_oslavence.", narozen ".$narozen_oslavence_rok.", ".$narozen_oslavence." oslaví ".UrciVek($narozen_oslavence_cele)." let. ".$zbyva_dni;
Otestováno. Pokud někdo přijdete na zjednodušení budu rád. A díky všem.
mackopu
Profil
Ještě lepší varianta dotazu:
SELECT jmeno, prijmeni, narozen,

REPLACE (narozen, YEAR(narozen), DATE_FORMAT(CURDATE(), IF(DATE_FORMAT(narozen, '%m-%d') < DATE_FORMAT(CURDATE(), '%m-%d'), DATE_FORMAT(DATE_ADD(CURDATE(), INTERVAL 1 YEAR), '%Y'), '%Y')))
AS nejblizsi_narozeniny
FROM clenove
ORDER BY nejblizsi_narozeniny
LIMIT 1
Toto téma je uzamčeno. Odpověď nelze zaslat.

0