Vybrat hodnoty se zadaným časovým rozestupem – MySQL – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Vybrat hodnoty se zadaným časovým rozestupem – MySQL – Fórum – Programujte.comVybrat hodnoty se zadaným časovým rozestupem – MySQL – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
28. 4. 2014   #1
-
0
-

Ahoj,

mám tabulku naměřených teplot (sloupce cas DateTime a teplota float). Do ní je při měření každou sekundu zapsána nová naměřená hodnota. Z této tabulky potřebuji vybrat naměřené hodnoty za zadané období navíc jen ty, které mají mezi sebou zadaný rozestup, např. pokud byl rozestup zadán 5s, vybere se první hodnota s datem a časem rovným zadanému počátku období a každá další bude mít datum a čas vyšší o 5s než předešlá. 

Zatím jsem to zkusil tak, že jsem udělal uloženou proceduru, která podle zadaného období a rozestupu vytvoří dočasnou tabulku časů a pak vyberu z tabulky neměřených hodnot požadované. 

/*
Vytvoří dočasnou tabulku 'casy' s časy od '2014-04-11 11:23:00' do '2014-04-11 11:26:00' s rozestupem časů 5s
*/
call vzorkovani('2014-04-11 11:23:00', '2014-04-11 11:26:00', 5);

/*
Přečte naměřené hodnoty za zadané období se zadaným rozestupem
*/
select cas, teplota from leva_teploty where cas in (select cas from casy);

Potřebuji aby i select z tabulky naměřených hodnot byl uvnitř procedury, při tom aby při volání procedury bylo možné zvolit tabulku a sloupce. Jak na to?

hu

Nahlásit jako SPAM
IP: 195.178.67.–
30. 4. 2014   #2
-
0
-

Jsem při pokusech narazil na další problém. Naplnit dočasnou tabulku pro 10-minutový úsek s odstupem 2s trvá přes 9s. Existuje rychlejší algoritmus? Jaký?

hu

Nahlásit jako SPAM
IP: 195.178.67.–
KIIV
~ Moderátor
+43
God of flame
30. 4. 2014   #3
-
+1
-
Zajímavé

pouzit unixtime a mod ... mozna to i pouzije index - pokud je to tedy ulozene interne jako unixtimestamp... jen pokud budes chtit casy jako  14:55:01 - 14:58:01 s 5s rozestupem, tak se to bude muset trosku vylepsit o odecteni baseline...

takze asi neco jako  where ts>=? and ts<=? and mod(ts, 5) = 0  ....   ci  mod(unix_timestamp(ts), 5) = 0
  nebo  mod(unix_timestamp(ts) - unix_timestamp(???start???), 5) = 0

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
30. 4. 2014   #4
-
0
-

Sloupec cas je DateTime. Ale i tak to bude rychlejší. Pro odstup 2s

select cas, teplota from leva_teploty where
 (cas between '2014-04-11 11:21' and '2014-04-11 11:31')
 and mod(unix_timestamp(cas) - unix_timestamp('2014-04-11 11:21'), 2) = 0;

pouhých 16 ms oproti původním 9s. 

Asi bych měl časové údaje ukládat přímo jako unixtimestamp.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
KIIV
~ Moderátor
+43
God of flame
30. 4. 2014   #5
-
0
-

#4 hlucheucho
tak tomu uz rikam rozdil.. evidentne to pouzilo ty indexy pro vyber intervalu a zbytek se uz proste prevest musel :)

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
30. 4. 2014   #6
-
0
-

Pro jiný odstup než 2s se to chová neočekávaně.  Pro 8 s je první hodnota z 11:21:02, pro 5s je to 11:21:04. Odstup je v pořádku. To odečtení počátečního času asi nebude OK.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
KIIV
~ Moderátor
+43
God of flame
30. 4. 2014   #7
-
0
-

tak si hod do   select *, unix_timestamp(cas) - unix_timestamp('2014-04-11 11:21'),  mod( ... , 8)

a nech si vypsat, co se to tam vlastne deje...  (a do podminky to pak nedat cely)

(snad se pak nesrovnava treba UTC+1 a GTM+1 :D to by pak nejaky ty sekundy odchylky byt mohly)

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
30. 4. 2014   #8
-
0
-

Upravil jsem tabulku aby sloupec s časem byl timestamp. V domění, že si to zkonvertuje na stejný typ jsem udělal 

select cas, teplota from leva_teploty where
 (cas between '2014-04-11 11:21' and '2014-04-11 11:31')
 and mod(cas - '2014-04-11 11:21', 8) = 0;

a problém je na světě.  Datum považuje za DateTime a konverzi je třeba dát explicitně: 

select cas, teplota from leva_teploty where
 (cas between '2014-04-11 11:21' and '2014-04-11 11:31')
 and mod(cas - unix_timestamp('2014-04-11 11:21'), 8) = 0;

Pak se chová podle očekávání.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Řešení
12. 5. 2014   #9
-
0
-
Vyřešeno Nejlepší odpověď

Zkusil jsem to pro 120 sekund rozestup a byl jsem nepříjemně překvapen, rozestup byl 1 min 20 s.  Odečítání časů jsem nakonec provedl po jejich převod na sekundy:

select cas, teplota from leva_teploty where
 (cas between '2014-04-11 11:21' and '2014-04-11 11:31')
 and mod(to_seconds(cas) - to_seconds('2014-04-11 11:21'), 120) = 0;

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 8 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý