SQL数据库(JDBC):date类型的列只存储日期值而不是时间值

时间:2018-04-10 10:35:47

标签: java rest date datetime jdbc

我有一个这样的数据库,其中lastEditeddate字段。

enter image description here

我使用" RESTFUL来自数据库的Web服务"

将此数据库连接到Java Web应用程序

这会自动为我的THREADCHAT列生成一个名为ThreadChat的类。这里给出的是lastEdited部分的getter和setter。

lastEdited是一个java.util.Date对象。

public Date getLastedited() {
    return lastedited;
}

public void setLastedited(Date lastedited) {
    this.lastedited = lastedited;
}

在这里,我正在创建一个新的ThreadChat对象并将数据添加到数据库中。 lastEdited的参数是java.util.Date对象。

    ThreadChat thread = new ThreadChat(threadName, new Date(), loginIdInt);
    threadChatFacadeREST.create(thread);

这会像这样更新表格。

enter image description here

此方法返回THREADCHAT表中的所有记录。

List<ThreadChat> list = getAllThreads();

但是,getLastEdited()会返回XMLGregorianCalender个对象而不是Date个对象,就像上面的getter方法一样。

enter image description here

如果我将这个对象打印到控制台,那么日期部分就在那里,但我每次都会得到00:00的分钟和小时部分。

2018-04-10T00:00:00+05:30

如何在JDBC数据库中存储Date + Time并检索它们?

3 个答案:

答案 0 :(得分:2)

您的数据库中的字段类型为DATE,因此DATE仅存储YYYY-MM-DD

如果您还要存储时间,则必须将数据库中字段的类型更改为DATETIME。这表示为:YYYY-MM-DD HH:MI:SS

更多信息请参阅:https://www.w3schools.com/sql/sql_datatypes.asp

答案 1 :(得分:1)

您正在寻找DATA_TYPE TIMESTAMP。如果可以,您应该更改数据库。

答案 2 :(得分:1)

TL;博士

您使用仅限日期type来保存日期时间值 - 尝试适合square peg into a round hole

  

如何在JDBC数据库中存储Date + Time并检索它们?

要存储片刻,日期时间值,请使用日期时间类型:

    数据库中
  • TIMESTAMP WITH TIME ZONE
  • Java中的
  • Instant

您正在使用非常混乱的遗留类。仅使用 java.time 类。

数据库不同

数据库的日期时间data types及其行为差异很大。您没有指定数据库,因此我们只能猜测或遵守SQL standard

遗憾的是,SQL标准几乎没有触及日期时间处理的主题。该标准简要定义:

  • DATE作为仅限日期的值,没有时间。
  • TIMESTAMP WITHOUT TIME ZONE是日期和时间,但缺少任何时区概念或偏离UTC的概念,因此代表实际时刻。
  • 对于实际时刻,请使用TIMESTAMP WITH TIME ZONE。该类型名称可能会产生误导,因为某些实现(如Postgres)不会存储带有值的区域,而是使用任何传递的区域信息调整为UTC值进行存储。

java.time

您使用的是最早版本的Java中可怕的旧日期时间类。这些在Java 8及更高版本中被 java.time 类取代。切勿再次使用DateCalendar

除非业务逻辑或用户界面明确要求,否则通常最好在UTC中思考,工作,存储,记录和交换日期时间值。所以通常你应该关注Instant类。 Instant类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds(小数部分最多九(9)位)。此课程取代java.util.Date

捕获UTC中的当前时刻。

Instant instant = Instant.now() ;  // Capture the current moment in UTC.

将此Instant存储在SQL标准类型TIMESTAMP WITH TIME ZONE的数据库列中,或类似于特定数据库中的任何内容。

JDBC 4.2

从JDBC 4.2及更高版本开始,您可以直接与数据库交换 java.time 对象。

myPreparedStatement.setObject( … , instant ) ;

检索。

Instant instant = myResultSet.getObject( … , Instant.class ) ;

转换

如果提交过时的XMLGregorianCalendar,请立即通过过时的GregorianCalendar类转换为 java.time ZonedDateTime

ZonedDateTime zdt = myXmlGregCal.toGregorianCalendar().toZonedDateTime() ;  // Convert from legacy classes to modern java.time class.

如果您希望在UTC中看到同一时刻而不是该特定区域(时区)的人使用的挂钟时间,请提取Instant

Instant instant = zdt.toInstant() ;  // Adjust from zoned moment to UTC. Same moment, same point on the timeline, different wall-clock time.

如果您必须与尚未更新为 java.time 的旧代码进行互操作,则可以来回转换。提示:尽量保持在 java.time 中。遗留类是糟糕的设计混乱。

java.util.Date myJavaUtilDate = java.util.Date.from( instant ) ;

而且,走向另一个方向。

Instant instant = myJavaUtilDate.toInstant() ;

关于 java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和&amp; SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore