xom`s pinion - Tom Hnatovsky Blog
SUM intervalů v PostgreSQL
Některá data a agregace dat lze z databáze dostat jednoduše, jiné složitěji. Ale prakticky vše má své řešení, jak jsme si zde již párkrát ukázali.
Dnes tu máme aplikaci pro evidenci pracovní doby, ve které je nutné pracovat s rozdíly časů a čas od času se vyskytne i potřeba součtu všech rozdílů z dceřinné tabulky.
Rozdíl datových typů timestamp, time či date lze jednoduše získat použitím prostého rozdílu.
SELECT time_to - time_from FROM workers
Výsledkem je hodnota typu interval, se kterým pracuje mnoho dalších metod v Postgre.
A teď k té sumě
Pokud ale jsou odpracované hodiny uloženy v dceřiné tabulce, tak potřebujeme provést agregaci dat, která se nám jednoduše s intervalem nepovede.
SUM(time_to - time_from)
bude vracet null.
Jako nejjednodušší řešení mi přijde volba jednotky, ve které chci agregovaná data mít - nám budou stačit minuty, které si z intervalu vytáhneme pomocí date_part funkce.
SELECT
SUM(
date_part('hour', work.time_to - work.time_from)*60 +
date_part('minute', work.time_to - work.time_from)
)
FROM work
WHERE id_worker = 1
Výsledkem bude double obsahující součet rozdílů časů v minutách.
Komentovat
Článek zatím nebyl komentován. Podělte se svým názorem.