sql >> Databáze >  >> RDS >> Oracle

Je časové pásmo java.sql.Timestamp specifické?

Ačkoli to není výslovně uvedeno pro setTimestamp(int parameterIndex, Timestamp x) řidiči musí dodržovat pravidla stanovená v setTimestamp(int parameterIndex, Timestamp x, Calendar cal) javadoc:

Nastaví určený parametr na daný java.sql.Timestamp hodnotu pomocí daného Calendar objekt. Ovladač používá Calendar objekt pro vytvoření SQL TIMESTAMP hodnotu, kterou pak ovladač odešle do databáze. S Calendar objekt, může řidič vypočítat časové razítko s přihlédnutím k vlastní časové zóně. Pokud žádný Calendar Pokud je zadán objekt, ovladač použije výchozí časovou zónu, což je časové pásmo virtuálního počítače, na kterém je aplikace spuštěna.

Když zavoláte pomocí setTimestamp(int parameterIndex, Timestamp x) ovladač JDBC používá časové pásmo virtuálního počítače k ​​výpočtu data a času časového razítka v tomto časovém pásmu. Toto datum a čas je to, co je uloženo v databázi, a pokud ve sloupci databáze nejsou uloženy informace o časovém pásmu, dojde ke ztrátě všech informací o pásmu (což znamená, že je na aplikacích používajících databázi, aby konzistentně stejné časové pásmo nebo přijít s jiným schématem pro rozlišení časového pásma (tj. uložit do samostatného sloupce).

Například:Vaše místní časové pásmo je GMT+2. Uložíte "2012-12-25 10:00:00 UTC". Skutečná hodnota uložená v databázi je "2012-12-25 12:00:00". Znovu jej načtete:dostanete jej zpět jako „2012-12-25 10:00:00 UTC“ (ale pouze v případě, že jej načtete pomocí getTimestamp(..) ), ale když jiná aplikace přistupuje k databázi v časovém pásmu GMT+0, načte časové razítko jako „2012-12-25 12:00:00 UTC“.

Pokud jej chcete uložit v jiném časovém pásmu, musíte použít setTimestamp(int parameterIndex, Timestamp x, Calendar cal) s instancí Kalendáře v požadovaném časovém pásmu. Jen se ujistěte, že při načítání hodnot používáte také ekvivalentní getter se stejným časovým pásmem (pokud používáte TIMESTAMP bez informací o časovém pásmu ve vaší databázi).

Za předpokladu, že chcete uložit skutečné časové pásmo GMT, musíte použít:

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
stmt.setTimestamp(11, tsSchedStartTime, cal);

S JDBC 4.2 by měl kompatibilní ovladač podporovat java.time.LocalDateTime (a java.time.LocalTime ) pro TIMESTAMP (a TIME ) prostřednictvím get/set/updateObject . java.time.Local* třídy jsou bez časových pásem, takže není třeba používat žádný převod (ačkoli to může otevřít novou sadu problémů, pokud váš kód předpokládá konkrétní časové pásmo).



  1. Jak CHARSET() funguje v MariaDB

  2. Zpracování ExecuteScalar(), když nejsou vráceny žádné výsledky

  3. Jak zálohovat databázi Moodle MariaDB

  4. Změňte typ sloupce s čísly z varchar na int