Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Czy strefa czasowa java.sql.Timestamp jest specyficzna?

Chociaż nie jest to wyraźnie określone dla setTimestamp(int parameterIndex, Timestamp x) sterowniki muszą przestrzegać reguł ustanowionych przez setTimestamp(int parameterIndex, Timestamp x, Calendar cal) javadoc:

Ustawia wyznaczony parametr na podany java.sql.Timestamp wartość, używając podanego Calendar obiekt. Sterownik korzysta z Calendar obiekt do skonstruowania SQL TIMESTAMP wartość, którą sterownik następnie wysyła do bazy danych. Z Calendar obiekt, kierowca może obliczyć znacznik czasu z uwzględnieniem niestandardowej strefy czasowej. Jeśli nie Calendar określony obiekt, sterownik używa domyślnej strefy czasowej, która jest strefą maszyny wirtualnej z uruchomioną aplikacją.

Kiedy dzwonisz z setTimestamp(int parameterIndex, Timestamp x) sterownik JDBC używa strefy czasowej maszyny wirtualnej do obliczania daty i godziny znacznika czasu w tej strefie czasowej. Ta data i godzina jest przechowywana w bazie danych, a jeśli kolumna bazy danych nie przechowuje informacji o strefie czasowej, wszelkie informacje o strefie zostaną utracone (co oznacza, że ​​to od aplikacji korzystających z bazy danych zależy użycie spójnie w tej samej strefie czasowej lub wymyśl inny schemat rozróżniania strefy czasowej (tj. przechowuj w osobnej kolumnie).

Na przykład:Twoja lokalna strefa czasowa to GMT+2. Przechowujesz „2012-12-25 10:00:00 UTC”. Rzeczywista wartość przechowywana w bazie danych to „2012-12-25 12:00:00”. Odzyskujesz go ponownie:otrzymasz go ponownie jako „2012-12-25 10:00:00 UTC” (ale tylko wtedy, gdy odzyskasz go za pomocą getTimestamp(..) ), ale gdy inna aplikacja uzyskuje dostęp do bazy danych w strefie czasowej GMT+0, pobierze znacznik czasu jako „2012-12-25 12:00:00 UTC”.

Jeśli chcesz przechowywać go w innej strefie czasowej, musisz użyć setTimestamp(int parameterIndex, Timestamp x, Calendar cal) z instancją Kalendarza w wymaganej strefie czasowej. Tylko upewnij się, że używasz równoważnego gettera z tą samą strefą czasową podczas pobierania wartości (jeśli używasz TIMESTAMP bez informacji o strefie czasowej w Twojej bazie danych).

Zakładając więc, że chcesz zapisać aktualną strefę czasową GMT, musisz użyć:

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

Z JDBC 4.2 zgodny sterownik powinien obsługiwać java.time.LocalDateTime (i java.time.LocalTime ) dla TIMESTAMP (i TIME ) przez get/set/updateObject . java.time.Local* klasy nie mają stref czasowych, więc nie trzeba stosować konwersji (chociaż może to spowodować nowy zestaw problemów, jeśli twój kod zakłada określoną strefę czasową).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak używać sql * plus w skrypcie poleceń systemu Windows do sterowania przepływem?

  2. Top 5 czasochłonnych zapytań SQL w Oracle

  3. Jak połączyć się z Oracle przy użyciu nazwy usługi zamiast SID

  4. Kopiowanie danych z pliku do CLOB w Oracle

  5. Jak utworzyć plik login.sql dla SQLcl