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 () 메소드 일어나고 가정합니다. 캔 사람이 되거? 건배.
바질 우르 큐 :
SQL 표준
SQL 표준
SQL 표준
왜 끔찍한 기존 클래스 혼합되어 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 ZONE
MySQL의 유형과 같은 DATETIME
자바 유형을 사용합니다 LocalDateTime
. 이 유형은 시간대의 맥락없이 단지 날짜와 시간의 일이 있거나 오프셋에서-UTC. 따라서이 유형은 않습니다 없는 순간을 나타냅니다.
LocalDateTime ldt = myResultSet.getObject( … , OffsetDateTime.class ) ;
LocalDate ld = ldt.toLocalDate() ;