ResultSet의 GETDATE ()는 잘못된 및 올바른 날짜를 반환

R WRI :

나는 휴일의 테이블에서 LOCALDATE의 목록을 작성하고있다. 날짜는 모든 데이터베이스 테이블에서 올바른지,하지만 난 모든 날짜와 ResultSet의 GETDATE () 메소드를 사용하여 목록을 채울 때 날짜의 4 잘못 6가 정확합니다. 나는이 경우 이유를 알아내는 어떤 도움을 찾고 있어요.

final LocalDate currentDay = LocalDate.now();
final List<LocalDate> holidays = getHolidays(currentDay);

//This method takes in a date and calculates the holidays that occur that year
public static List<LocalDate> getHolidays(final LocalDate date) {
 final List<LocalDate> holidayList = new ArrayList<LocalDate>();

 try {
   final PreparedStatement holidaysByYearQuery = conn.prepareStatement(
      "SELECT fulldate FROM holidays WHERE YEAR(fulldate) = ?");

    holidaysByYearQuery.setObject(1, date.getYear());

    final ResultSet holidaysByYearResult = holidaysByYearQuery.executeQuery();

    while (holidaysByYearResult.next()) {
      final Date holidate = (Date) holidaysByYearResult.getObject(1);
      final LocalDate holiday = holidate.toLocalDate();
      holidayList.add(holiday);
    }
  } catch (final SQLException e) {
    LOGGER.log(Level.WARNING, "Could not query holiday table: " + e.getMessage());
  }
  return holidayList;
 }

// This is the query used in Java:
com.mysql.cj.jdbc.PreparedStatement@1c27c773: SELECT fulldate FROM holidays WHERE YEAR(fulldate) = 2019

// Here is the list that is returned from the method
[2018-12-31, 2019-02-17, 2019-04-19, 2019-05-20, 2019-07-01, 2019-08-05, 2019-09-02, 2019-10-14, 2019-12-24, 2019-12-25]

다음은 데이터베이스 테이블의 정보입니다. 그것은 매우 기본이다.

CREATE TABLE holidays( 
province VARCHAR(255), 
holiday VARCHAR(255), 
fulldate DATETIME);

INSERT INTO holidays(province, holiday, fulldate) VALUES
('Ontario', 'New Years', '2019-01-01'), 
('Ontario', 'Family Day', '2019-02-18'), 
('Ontario', 'Good Friday', '2019-04-19'), 
('Ontario', 'Victoria Day', '2019-05-20'), 
('Ontario', 'Canada Day', '2019-07-01'), 
('Ontario', 'Civic Holiday', '2019-08-05'), 
('Ontario', 'Labour Day', '2019-09-02'), 
('Ontario', 'Thanksgiving', '2019-10-14'), 
('Ontario', 'Christmas Day', '2019-12-25'), 
('Ontario', 'Boxing Day', '2019-12-26');

// This is the select result from the query above

+---------------------+
|       fulldate      |
+---------------------+
| 2019-01-01 00:00:00 |
+---------------------+
| 2019-02-18 00:00:00 |
+---------------------+
| 2019-04-19 00:00:00 |
+---------------------+
| 2019-05-20 00:00:00 |
+---------------------+
| 2019-07-01 00:00:00 |
+---------------------+
| 2019-08-05 00:00:00 |
+---------------------+
| 2019-09-02 00:00:00 |
+---------------------+
| 2019-10-14 00:00:00 |
+---------------------+
| 2019-12-25 00:00:00 |
+---------------------+
| 2019-12-26 00:00:00 |
+---------------------+

이 목록의 각 끝에있는 두 날짜를 볼 수 있듯이 올바르지 않습니다. 뭔가가 GETDATE () 메소드 일어나고 가정합니다. 캔 사람이 되거? 건배.

바질 우르 큐 :

왜 끔찍한 기존 클래스 혼합되어 Date현대와를 LocalDate? 그리고 왜 캐스팅 (Date)?

SQL 표준 DATE

당신의 열은 SQL 표준에 가까운 형태 인 경우 DATE, 다음 사용 LocalDate나중에 JDBC 4.2과 JDBC 드라이버 준수와 함께.

LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;

SQL 표준 TIMESTAMP WITH TIME ZONE

당신의 열은 SQL 표준에 가까운 형태 인 경우 TIMESTAMP WITH TIME ZONE에, 당신은 날짜를 결정하는 시간대를 고려해야합니다.

OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
ZoneId z = ZoneId.of( "Australia/Sydney" ) ;
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;
LocalDate ld = zdt.toLocalDate() ;

SQL 표준 TIMESTAMP WITHOUT TIME ZONE

당신의 열이와 유사한 데이터 유형 인 경우, SQL 표준 TIMESTAMP WITHOUT TIME ZONEMySQL의 유형과 같은 DATETIME자바 유형을 사용합니다 LocalDateTime. 이 유형은 시간대의 맥락없이 단지 날짜와 시간의 일이 있거나 오프셋에서-UTC. 따라서이 유형은 않습니다 없는 순간을 나타냅니다.

LocalDateTime ldt = myResultSet.getObject( … , OffsetDateTime.class ) ;
LocalDate ld = ldt.toLocalDate() ;

(현대 및 기존 모두) 및 표준 SQL에서 자바의 테이블 목록을 날짜 - 시간 유형.

추천

출처http://43.154.161.224:23101/article/api/json?id=337314&siteId=1