복붙노트

[SQL] 는 SQL TIMESTAMP 컬럼에 자바 날짜를 작성하기 전에, JDBC는 데이터베이스 세션 시간대에 JVM 시간대에서 날짜를 변환합니까?

SQL

는 SQL TIMESTAMP 컬럼에 자바 날짜를 작성하기 전에, JDBC는 데이터베이스 세션 시간대에 JVM 시간대에서 날짜를 변환합니까?

는 SQL TIMESTAMP 컬럼에 자바 날짜를 작성하기 전에, JDBC는 데이터베이스 세션의에 자바 가상 머신의 시간대에서 날짜를 변환합니까?

예를 들어, Java 가상 머신의 시간대는 UTC하고 데이터베이스 세션 시간대는 UTC-5 가정하자. 자바 프로그램의 시도는 JDBC 표준에 따라, PreparedStatement의 # setTimestamp (INT, 타임 스탬프)에 전달하여 2000-01-01 0시 0분 0초를 저장하는 경우, 의지 데이터베이스 저장 TIMESTAMP '2000-01-01 0시 : 00 '또는 TIMESTAMP'1999년 12월 31일 19시 0분 0초 '?

해결법

  1. ==============================

    1.아니, JDBC 클라이언트가 데이터베이스에 액세스 할 수있는 방법에 단지 API입니다. 타임 스탬프 저장, 이것은 자신의 데이터베이스 드라이버를 기록하는 조직에 의해 의존해야 할 것이다는 JDBC API 표준을 준수 함.

    아니, JDBC 클라이언트가 데이터베이스에 액세스 할 수있는 방법에 단지 API입니다. 타임 스탬프 저장, 이것은 자신의 데이터베이스 드라이버를 기록하는 조직에 의해 의존해야 할 것이다는 JDBC API 표준을 준수 함.

    여기에서의 PreparedStatement의 MySQL의 구현의 구현입니다. 그들은 MySQL의 시간대에 자바의 JVM 시간대를합니다 (setTimestampInternal () 메소드를 확인)이 걸릴 것으로 보인다.

  2. ==============================

    2.이제 내 요구는 JVM의 시간대에 관계없이 GMT / UTC에 값을 저장해야한다는 것입니다. 즉석에서 시간대를 설정하는 방법이 있나요 내가이 JDBC로 끝났어요 일단 다음 설정을 해제하기 위해?

    이제 내 요구는 JVM의 시간대에 관계없이 GMT / UTC에 값을 저장해야한다는 것입니다. 즉석에서 시간대를 설정하는 방법이 있나요 내가이 JDBC로 끝났어요 일단 다음 설정을 해제하기 위해?

    편집하다: 좋아, 나는 그 문제 주위에 방법을 찾아 냈다. 다음나요

    TimeZone default = TimeZone.getDefault();
    try
    {
      TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
    
      //Do stuff with JDBC
    }
    finally
    {
      TimeZone.setDefault(default);
    }
    
  3. ==============================

    3.당신은 시간대를 지정하는 달력 인스턴스를 받아들이는 오버로드 setTimestamp 세터를 사용할 수 있습니다

    당신은 시간대를 지정하는 달력 인스턴스를 받아들이는 오버로드 setTimestamp 세터를 사용할 수 있습니다

    샘플 (당신이 Joda의 날짜를 사용하는 경우) :

    org.joda.time.DateTime sendDateUTC = new DateTime( DateTimeZone.UTC ).withMillis( millis );
    statement.setTimestamp (1, sendDateUTC, sendDateUTC.toGregorianCalendar() );
    

    자바 독에 따라 : 지정된 java.sql.Timestamp 치로, 지정된 파라미터가 지정된 Calendar 객체를 사용해 설정합니다. 드라이버는 데이타베이스에 보냅니다 SQL TIMESTAMP 값을 작성해, 달력 개체를 사용합니다. 커스텀 타임 존 계정에 Calendar 객체를 사용하면, 드라이버는 타임 스탬프 복용을 계산할 수 있습니다. Calendar 오브젝트를 지정하지 않는 경우, 드라이버는 어플리케이션으로 실행되는 가상 머신의 타임 존인 디폴트의 타임 존을 사용합니다.

    void setTimestamp(int parameterIndex, java.sql.Timestamp x, Calendar cal)
        throws SQLException;
    
  4. ==============================

    4.사양은 바보입니다. 증강 참조 프레임 에포크에서 java.util.Date 저장 밀리. 을 java.sql.Timestamp 데이트 더한 동일한 참조 프레임 나노초. 비되지 getter 및 setter 모두는 GMT 기준 프레임을 사용합니다. 정신의 어떤 종류를 들어, 저장하는 타임 스탬프의 기본 시간대는 그리니치 표준시해야한다.

    사양은 바보입니다. 증강 참조 프레임 에포크에서 java.util.Date 저장 밀리. 을 java.sql.Timestamp 데이트 더한 동일한 참조 프레임 나노초. 비되지 getter 및 setter 모두는 GMT 기준 프레임을 사용합니다. 정신의 어떤 종류를 들어, 저장하는 타임 스탬프의 기본 시간대는 그리니치 표준시해야한다.

    다중 계층 응용 프로그램에서 프런트 엔드, 드라이버, 데이터베이스 서버는 모든 다른 시간대에있을 수 있습니다. 계층 (tier)의 일부는 같은 시간에 다른 시간대에있을 수 있습니다; 당신이 인터넷하고 있다면 예를 들어, 대륙에 걸쳐 부하를 분산, 또는 당신이있는 경우 모바일 앱은 중앙 서버에 연결. 클라우드 운영 환경은 훨씬 당신이 JDBC 드라이버가 실행됩니다 아무 생각이 같은 시나리오도 변경하지 않습니다 어떤 보장 될 것이다.

    나는 이러한 환경에서 일관성을 달성하기 위해 알고있는 유일한 방법은 단지 달력을 받아 매개 변수 세터와의 ResultSet 게터를 사용하고, 데이터가 일부 달력, 양호하게는 GMT 또는 UTC를 사용하여 액세스해야합니다 모든 응용 프로그램을 만드는 것입니다.

  5. from https://stackoverflow.com/questions/4123534/before-writing-a-java-date-to-an-sql-timestamp-column-does-jdbc-translate-the-d by cc-by-sa and MIT license