Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



UTC DateTime v DB + grupovani

Seznam témat     Nová odpověď

Přihlásit se     Registrace     Zapomenuté heslo

Re: UTC DateTime v DB + grupovani

Autor: Maaartin

19:08:53 04.08.2010

Tady je spis problem v tom ze se nevyuzije index.

Pro grupovani je nutny pouzit lokalni cas, ale pro podminku vyhledavani jde pouzit i UTC, takze

select datetime at time zone 'UTC'
from data where datetime
between '2010.06.30 22:00' and '2010.07.31 22:00'
order by datetime limit 10

by melo byt rychly a spravny.

Citovat příspěvek

 

Re: UTC DateTime v DB + grupovani

Autor: tcesky

8:24:40 04.08.2010

ale prvni dotaz je korektni pouze pokud se tyka jedne casove zony a jednoho obdobi.

Druhy dotaz muze pracovat i v obdobi zahrnujicim zmenu zimni/letni case a muze kombinovat zaznamy ze Zizkova, Nusli a Tokia. Je logicke, ze se musi s daty mazlit podstatne vic.

Zdravim

TC

Citovat příspěvek

 

Re: UTC DateTime v DB + grupovani

Autor: p

1:35:53 04.08.2010

S temi casovymi zonami to funguje jak ma. Ale zase je trochu problem cas. Napr.:

select datetime
from data where datetime
between '2010.07.01 00:00' and '2010.08.01 00:00'
order by datetime limit 10

trva 16 ms, zatimco

select datetime at time zone 'UTC'
from data where datetime at time zone 'UTC'
between '2010.07.01 00:00' and '2010.08.01 00:00'
order by datetime limit 10

trva 1846 ms

Citovat příspěvek

 

Re: UTC DateTime v DB + grupovani

Autor: ondro1234

13:29:55 18.07.2010

A skusit ten datetime este pred date_trunc() nejako skonvertovat priamo v selekte?
Napr:
SELECT TIMESTAMP '2001-02-16 20:38:40' AT TIME ZONE 'MST';

Result: 2001-02-16 19:38:40-08


alebo nejakou conv funkciou ako je mySQL CONVERT_TZ().

Citovat příspěvek

 

UTC DateTime v DB + grupovani

Autor: p

10:01:23 18.07.2010

Ahoj, predstavte si nasledujici problem:

Mame tabulku tab(datetime, val), ktera obsahuje miliony zaznamu a potrebujeme vypsat denni prumery hodnot. Zgrupujeme tedy hodnoty po dnech nejak takto:

select date_trunc('day', datetime) as dt, avg(val)::float from tab where datetime > @datetimefrom AND datetime < @datetimeto group by dt order by dt

Rekneme, ze nas zajima obdobi od 1.7.2010 do 1.8.2010. Protoze, ale mame v tabulce ulozeno datum v UTC musime obe data prevest na UTC. Na pozadi se odectou z obou datumu 2 hodiny. Dostaneme tedy datumy: 30.6.2010 22:00 a 31.7.2010 22:00.

Spustime SQL dotaz a dostaneme zprumerovane hodnoty pro data:
30.6.2010 0:00, 1.7.2010 0:00, 2.7.2010 0:00, atd.

Predevedenim na lokalni cas ziskame:
30.6.2010 2:00, 1.7.2010 2:00, 2.7.2010 2:00, atd.

Na zacatku jsme ovsem chteli obdobi od 1.7.2010 a ve vysledku mame 30.6.2010!

Jedine co me napada je nacitat vsechny hodnoty z db bez grupovani, provest vyber, prevest na lokalni cas a az pak grupovat programove. Problem je ale mnoho zaznamu v db - miliony.

Jina moznost je smazat natrdo prvni datum+hodnotu z vysledku a pripadne osetrit dalsi stavy, pokud jsou, ale to neni zrovna moc elegantni reseni.

Mate nejaky napad?

Citovat příspěvek

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: