Autor Zpráva
RadkaPer
Profil *
Dobrý den,
ukládám si na jednotlivé dny data do mySQL a vždy k nim přidám i datum ve tvaru Time(). Potřebovala bych ale udělat script, který zkontroluje třeba za posledních 10 dní, zda-li nějaké datum tam nechybí.

Nevíte jak tohle udělat?
Tori
Profil
RadkaPer:
Jestli chcete jen ověřit, jestli nechybí některé datum (bez zjišťování které), stačí zjistit, jestli počet různých datumů (select distinct), které odpovídají podmínce datum >= (teď - $x dní) odpovídá hodnotě $x.
Pro nalezení chybějících datumů by byl např. left join na tutéž tabulku (tedy dva různé aliasy ale stejná tabulka), kde alias1.datum = (alias2.datum-1) AND alias1.datum IS NULL. edit: tohle jsem napsala špatně, IS NULL by muselo být až ve WHERE. Ale myšlenka je snad pochopitelná.

Jinak snadněji by se s tím sloupcem pracovalo, kdyby byl typu DATETIME nebo nejlépe DATE, takhle musíte převádět na DATE pomocí FROM_UNIXTIME(`sloupec`, '%Y-%m-%d)
RadkaPer
Profil *
Nepotřebuji zjišťovat jaké datum chybí. Chci jen, aby script udělal dotaz na mySQL a ten mě řekl, zda-li je to OK nebo ne.
Nemáte prosím nějaký více rozepsaný script, který bych mohla použít? Hrozně moc děkuji.
Tori
Profil
$pocetDni = 10;
$result = mysql_query("SELECT COUNT(*) FROM (
  SELECT DISTINCT FROM_UNIXTIME(`datum`, '%Y-%m-%d') df
    FROM `tabulka`) t
  WHERE `df` > CURDATE() - INTERVAL $pocetDni DAY");
if ($result) {
  $pocetDb = mysql_result($result, 0);
  if ($pocetDni === $pocetDb) {
    echo 'Nic nechybí.';
  } else {
    echo 'Během posledních '.$pocetDni.' dní nebyla v některý den uložena data do DB!';
  }
} else {
  // chyba sql dotazu.
}
Doplňte si správné názvy tabulky a sloupce s datumem.
edit: Opravena chyba v SQL dotazu.
RadkaPer
Profil *
Tabulka: data_dny
Datum mám jako: datum

SELECT COUNT(id) FROM (SELECT DISTINCT FROM_UNIXTIME('datum', '%Y-%m-%d') df FROM data_dny) data_dny WHERE df > CURDATE() - INTERVAL 10

MySQL error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
Tori
Profil
FROM_UNIXTIME(`datum` ... - zpětné apostrofy nebo nic.
RadkaPer
Profil *
Bohužel stále s chybou.
Pro jistotu přikládám složení tabulky: data_dny

id    int(11) Auto Increment     
datum    int(11)     
platnost    tinyint(1)     
ikonka    int(11)      
text    text     
osoba    int(11)     
cron    int(11)     
time    int(11)
Tori
Profil
RadkaPer:
A jo, přehlédla jsem, má to končit WHERE df > CURDATE() - INTERVAL 10 DAY
Pardon.
RadkaPer
Profil *
Už to funguje, moc děkuji.

Jen se ještě chci zeptat. Chtěla bych tam přidat ještě podmínku, že platnost se musí rovnat 1, tj. zkoušela jsem dát WHERE platnost='1', ale napíše mě to, že platnost neexistuje, tak nevím.

Ještě jednou moc děkuji za tuto výpomoc a bude to vše ;)
Tori
Profil
RadkaPer:
Při tom porovnání datumů se nepracuje přímo s tabulkou v DB, ale s výsledkem poddotazu - je to jakoby dočasná tabulka, vytvořená z dat vrácených poddotazem, proto musí např. povinně mít alias. V hlavním dotazu máte ve WHERE k dispozici jen ty sloupce, které vrátí poddotaz. Podmínku přidejte k poddotazu.
RadkaPer
Profil *
Funguje, opět moc děkuji.

Tohle tedy funguje od aktuálního datumu 16.4.2012 ... ale co když to chci počítat až od datumu třeba 17.4.2012 ?
Tori
Profil
RadkaPer:
edit: Přidat ještě jednu podmínku do hlavního dotazu:
$nejake_datum = '2012-03-10';
mysql_query(" ... WHERE df > '$nejake_datum' - INTERVAL $pocetDni DAY AND df <= '$nejake_datum'");
(Předpokládám, že to od 17.4. chcete počítat v jiný den než 17.4.)
PS: Koukněte kdyžtak na MySQL funkce pro práci s časem, hodí se vám.
RadkaPer
Profil *
Pro dnešních $nejake_datum = '2012-04-16'; mě to bohužel ukáže, že tam mám 0 položek, přičemž jsem do mySQL už uložil 3 řádky s datumem 2012-04-17, 2012-04-18 a 2012-04-19.

$result = mysql_query("SELECT COUNT(*) FROM (SELECT DISTINCT FROM_UNIXTIME('datum', '%Y-%m-%d') df FROM predpoved_dny) predpoved_dny WHERE df > '$nejake_datum' - INTERVAL $pocetDni DAY AND df <= '$nejake_datum'");

$pocetDb = mysql_result($result, 0);
echo $pocetDb; // vypise nula

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: