Ask Your Question
0

SQL - avg z timestamp

asked 2014-12-02 14:48:22 +0100

anonymous user

Anonymous

Ahojte, da sa nejak rozumne vypocitat cez AVG v SQL priemer zo stlpca, ktory ma hodnotu timestamp? Mam to v tvare hh:mm. Dik.

edit retag flag offensive close delete

Comments

SUM(sloupec) / COUNT(sloupec) by nefungoval? timestamp je int, tak by s tím neměl být problém...

Greg ( 2014-12-02 15:14:34 +0100 )edit

Timestamp je int v MySQL, ale ne obecně. Pozor na to!

Josef Kokeš ( 2014-12-02 15:17:03 +0100 )edit

1 Answer

Sort by » oldest newest most voted
2

answered 2014-12-02 15:14:12 +0100

Josef Kokeš gravatar image

updated 2014-12-02 15:15:03 +0100

Typ TIMESTAMP je určen pro časový okamžik, ne pro ukládání doby trvání. Z toho vyplývá, že průměr z toho nedává smysl ("průměrný okamžik příchodu zákazníka je 26. června 2014 v 13 hodin 56 minut 27,721 sekund") a tudíž to databáze normálně nepodporují (i když bych nechtěl dát hlavu na špalek, že třeba neexistuje nějaká, která by to dokázala - v otázkách tohoto typu je nutné říct, pro kterou databázi je otázka určena).

Dále budu předpokládat, že skutečně ukládáte jen hodiny a minuty a všechno ostatní je "nastavené na nulu" (takže fakticky máte hodnoty typu "1.1.1900 hh:mm:00", ale interpretujete je jako "měřená operace trvala hh hodin a mm minut").

Normálně se to dělá jedním ze dvou způsobů, příčemž oba jsou database-specific:

  1. Víme, jak databáze ukládá datum a čas. Pak můžeme vhodně odečíst nebo přetypovat a odečíst dva časové okamžiky a dostaneme rozdíl v nějaké jednotce, kterou pak přenásobíme na jednotku požadovanou. Například u Firebirdu víme, že datum a čas ukládá jako počet dní od nějakého počátečního data, takže pokud chceme dobu trvání operace v minutách, můžeme napsat něco jako SELECT (delka-CAST('1900-01-01 00:00:00' AS TIMESTAMP))*24*60 (předpokládáme, že vaše timestampy jsou uložené s datumem 1.1.1900).

  2. Víme, že naše databáze má funkce pro rozsekání timestampu na dílčí části. Pak můžeme použít tyto funkce pro vytáhnutí hodin a minut a vhodné vynásobení: SELECT 60*EXTRACT(HOUR FROM delka)+EXTRACT(MINUTE FROM delka).

Na takto vypočítanou hodnotu už můžeme použít AVG, protože to už je normální desetinné číslo.

Připomínám, že kompatibilita napříč databázemi je nulová.

edit flag offensive delete publish link more

Comments

parada, dakujem za vycerpavajucu odpoved :)

gandalf ( 2014-12-02 15:16:29 +0100 )edit

Your answer

Please start posting your answer anonymously - your answer will be saved within the current session and published after you log in or create a new account. Please try to give a substantial answer, for discussions, please use comments and please do remember to vote (after you log in)!

Add answer

[hide preview]

Question tools

Follow
1 follower

Stats

Asked: 2014-12-02 14:48:22 +0100

Seen: 160 times

Last updated: Dec 02 '14