【发布时间】:2019-12-03 21:00:22
【问题描述】:
我正在从假期表中创建一个 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 |
+---------------------+
如您所见,列表两端的 2 个日期不正确。我假设 getDate() 方法发生了一些事情。任何人都可以对此有所了解吗?干杯。
【问题讨论】:
-
您的列的数据类型究竟是什么?您使用的是什么数据库系统?
-
如果您只存储日期,为什么要使用 DateTime 作为类型? ResultSet 有一个 getDate 方法。我的猜测是,这是关于时区和不同的夏令时变化
-
@BasilBourque DATETIME 和 Mysql(Innodb)
-
@JoakimDanielson 这只是我现在拥有的模式。我之前使用过 DATE,它有完全相同的问题。
-
您对仅日期值使用了错误的类型。将您的列定义为
DATE。