Oracle
 sql >> база данни >  >> RDS >> Oracle

Специфична ли е часовата зона java.sql.Timestamp?

Въпреки че не е посочен изрично за setTimestamp(int parameterIndex, Timestamp x) драйверите трябва да спазват правилата, установени от setTimestamp(int parameterIndex, Timestamp x, Calendar cal) javadoc:

Задава определения параметър на дадения java.sql.Timestamp стойност, като използвате дадения Calendar обект. Драйверът използва Calendar обект за конструиране на SQL TIMESTAMP стойност, която след това драйверът изпраща към базата данни. С Calendar обект, водачът може да изчисли времевата марка, като вземе предвид персонализирана часова зона. Ако няма Calendar е посочен обект, драйверът използва часовата зона по подразбиране, която е тази на виртуалната машина, изпълняваща приложението.

Когато се обаждате с setTimestamp(int parameterIndex, Timestamp x) JDBC драйверът използва часовата зона на виртуалната машина, за да изчисли датата и часа на времевата марка в тази часова зона. Тази дата и час са това, което се съхранява в базата данни и ако колоната на базата данни не съхранява информация за часовата зона, тогава всяка информация за зоната се губи (което означава, че приложението(ата), използващо базата данни, зависи да използва една и съща часова зона последователно или измислете друга схема за разпознаване на часовата зона (т.е. съхранявайте в отделна колона).

Например:Вашата местна часова зона е GMT+2. Вие съхранявате "2012-12-25 10:00:00 UTC". Действителната стойност, съхранена в базата данни, е "2012-12-25 12:00:00". Извличате го отново:връщате го отново като „2012-12-25 10:00:00 UTC“ (но само ако го извлечете с помощта на getTimestamp(..)) ), но когато друго приложение осъществи достъп до базата данни в часовата зона GMT+0, то ще извлече клеймото за време като „2012-12-25 12:00:00 UTC“.

Ако искате да го съхраните в друга часова зона, тогава трябва да използвате setTimestamp(int parameterIndex, Timestamp x, Calendar cal) с екземпляр на Calendar в необходимата часова зона. Просто се уверете, че използвате и еквивалентния getter със същата часова зона, когато извличате стойности (ако използвате TIMESTAMP без информация за часовата зона във вашата база данни).

Така че, ако приемем, че искате да съхраните действителната часова зона по GMT, трябва да използвате:

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

С JDBC 4.2 съвместим драйвер трябва да поддържа java.time.LocalDateTimejava.time.LocalTime ) за TIMESTAMPTIME ) чрез get/set/updateObject . java.time.Local* класовете са без часови зони, така че не е необходимо да се прилага преобразуване (въпреки че това може да създаде нов набор от проблеми, ако кодът ви предполага конкретна часова зона).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. как да използвам ограничението за проверка в oracle

  2. ORA-21700:обектът не съществува или е маркиран за изтриване за асоциативен масив като входен параметър, извикан от ODP.NET

  3. Как предавате аргумент на PL/SQL блок в sql файл, извикан с помощта на START в sqlplus?

  4. Онлайн проверка на синтаксиса на SQL, съответстваща на множество бази данни

  5. Dynamic Oracle Pivot_In_Clause