Portál AbcLinuxu, 12. května 2025 17:03

Dotaz: casove pasmo a databaza

21.8.2009 12:26 peter
casove pasmo a databaza
Přečteno: 533×
Odpovědět | Admin

Ahoj, mam nasledujuci dotaz, ked zaznamenavam do db data z casovou znackou UTC, nasledne v aplikacii sa mi tento cas zobrazuje spravne s posunom +2 hod. Otazka znie, ked Spravym dotaz na databazu, v ktorom bude fixne vystupovat timestamp, odcita sa mi od tohoto casu casovy posun, alebo nie?

Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

21.8.2009 13:47 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: casove pasmo a databaza
Odpovědět | | Sbalit | Link | Blokovat | Admin

Nevím jak která databáze (nebylo uvedeno), ale timestamp je datový typ uchovávající většinou počet jednotek od nějakého data.
Tím pádem nemá údaj o časovém pásmu a předpokládal bych že se většinou zobrazí bez jakéhokoliv posunu, to znamená zapíši li tam například datum a čas přes NOW() vloží se tam 2009-08-21 13:30:00. a to tam bude a bez konverze se takto i vypíše bez ohledu na nastevní časové zóny v systému.
Ale například u MySql s sql_mode=MAXDB je typ TIMESTAMP v db zapisován jako typ DATETIME.
Postgre, jestli se nepletu, ukládá TIMESTAMP jako čas UTC a pokud není explicitně vynucena časová zóna při deklaraci datového typu TIMESTAMP with time zone, použije se systémová, takž Postgre má v TIMESTAMP čas uložen vždy UTC, ale pro výpis se aplikuje systémová zóna nebo definovaná (doufám že jsem to nepoplet).
Záleží o co Vám přesně jde...

To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
21.8.2009 14:39 peter
Rozbalit Rozbalit vše Re: casove pasmo a databaza

Ide o to ze ak si dam vypisat timestamp, a potom ho prekonvertujem cez utilitku "date" dostanem spravny cas. Ked vsak robim select a pouzijem funkciu db "from_unixtime" tak tam mam posun -5 hod. Db pouzivam MySql.

21.8.2009 16:18 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: casove pasmo a databaza

To je docela guláš..., vo co Vám go ?
Co je utilitka date fce nějakého progr. jazyku ?
Jak se záznamy do db dostanou (přiložte kód a sql dotaz) ?
Jak se záznamy z db vybírají (přiložte kód a sql dotaz) ?


PS: Timestamp se z MySql vypisuje ve formátu YYYY-MM-DD HH:MM:SS, pokud se přičte 0 dostane se reálné číslo. MySql funkce from_unixtime() konvertuje běžný 32bit integer do textové reprezentace datumu a času YYYY-MM-DD HH:MM:SS.
MySql a unix timestamp jsou rozdílně uložené záznamy a neexistuje převod 1:1,
zkuste si například:

 SELECT UNIX_TIMESTAMP('2009-03-29 02:00:00');
 SELECT UNIX_TIMESTAMP('2009-03-29 03:00:00');

vrátí to stejný výsledek 1238288400 (posun na letní čas...).
kdežtože

 SELECT TIMESTAMP('2009-03-29 02:00:00') + 0;
 SELECT TIMESTAMP('2009-03-29 03:00:00') + 0;

vrátí rozdílné výsledky.

To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
21.8.2009 16:49 peter
Rozbalit Rozbalit vše Re: casove pasmo a databaza

No mne

SELECT UNIX_TIMESTAMP('2009-03-29 02:00:00');

vratilo 1238310000

a

SELECT UNIX_TIMESTAMP('2009-03-29 03:00:00');

vrat 1238313600

 

21.8.2009 17:38 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: casove pasmo a databaza

No vidíte a mně oba 1238288400 jak na widlich (XP, MySql 5.0.45-community-nt ) tak na Linuxu (SuSe 11.1, MySql 5.0.67).
Sice nerozumím tak velkému rozdílu, ale je z toho patrné, že fce UNIX_TIMESTAMP() vrací hodnotu závislou na nastavení systému, takže její kombinace s DB a aplikačním prostředím musí být správná a nemusí být přenositelná (nebo naopak přenositelnost zajistí :) ).
Nicméně to neřeší Váš problém, u kterého by stačilo přiložit kousek kódu a hned by bylo jasněji.

To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
27.8.2009 12:58 branislav.durina
Rozbalit Rozbalit vše Re: casove pasmo a databaza

Peto predpokladam, ze myslis program date na linuxovej konzole, databaza zapisuje urcite spravne, chyba bude v rozdielnom nastaveni narodnych prostredi operacneho systemu a databazoveho systemu v danom pripade MySQL.

 

pozri si napriklad cez phpMyAmin premenne databazoveho systemu systemu

Konkretne si pozri

 

lc time names

 

potom zadaj an konzole pokial pouzivas linux prikaz locale

 

vrati ti nieco taketo vsimni si LC_TIME, hodnoty by mali byt totozne


LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
 

 

Pokial pouzivas ako klienta este trebars php skontroluj si locale aj v nom

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.