Autor | Zpráva | ||
---|---|---|---|
RadkaPer Profil * |
#1 · Zasláno: 15. 4. 2012, 18:16:17
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) . 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 * |
#3 · Zasláno: 15. 4. 2012, 20:33:40
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. } edit: Opravena chyba v SQL dotazu. |
||
RadkaPer Profil * |
#5 · Zasláno: 15. 4. 2012, 23:10:04
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 |
#6 · Zasláno: 15. 4. 2012, 23:31:11
FROM_UNIXTIME(`datum` ... - zpětné apostrofy nebo nic.
|
||
RadkaPer Profil * |
#7 · Zasláno: 15. 4. 2012, 23:46:12
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 |
#8 · Zasláno: 16. 4. 2012, 00:07:44
RadkaPer:
A jo, přehlédla jsem, má to končit WHERE df > CURDATE() - INTERVAL 10 DAY
Pardon. |
||
RadkaPer Profil * |
#9 · Zasláno: 16. 4. 2012, 00:13:35
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 |
#10 · Zasláno: 16. 4. 2012, 00:25:38
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 * |
#11 · Zasláno: 16. 4. 2012, 10:11:05
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'"); PS: Koukněte kdyžtak na MySQL funkce pro práci s časem, hodí se vám. |
||
RadkaPer Profil * |
#13 · Zasláno: 16. 4. 2012, 20:15:56
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 |
||
Časová prodleva: 12 let
|
0