【问题标题】:SQL database (JDBC): A column of type date only stores date values and not time valuesSQL 数据库 (JDBC):日期类型的列只存储日期值而不存储时间值
【发布时间】:2018-04-10 10:35:46
【问题描述】:

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

我使用“来自数据库的 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);

这会像这样更新表格。

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

List<ThreadChat> list = getAllThreads();

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

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

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

如何在 JDBC 数据库中存储日期和时间并同时检索两者?

【问题讨论】:

  • 因此,快速搜索SQL data types 提供了许多非常有趣的结果。只是第一次点击 - "DATE() 一个日期。格式:YYYY-MM-DD",这解释了一点,但也许 "DATETIME() *A 日期和时间组合. 格式:YYYY-MM-DD HH:MI:SS"会更有用
  • 你似乎没有在这里问过问题。实际问题是什么?哦,DATE 只是一个日期。 DATETIME 是日期和时间。 应该是这样的
  • @DawoodibnKareem 我想存储和检索时间以及日期。
  • 可能重复java sql date time
  • @MadProgrammer 我没有使用 java.sql.date。使用存储日期和时间的 java.util.date。

标签: java rest date datetime jdbc


【解决方案1】:

数据库中字段的类型是DATE,所以DATE 只存储YYYY-MM-DD

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

更多信息在:https://www.w3schools.com/sql/sql_datatypes.asp

【讨论】:

  • 我最终使用了时间戳。由于解释和提供的来源,我选择了您的答案。
  • 您应该澄清您对“日期时间”的回答。其格式为:YYYY-MM-DD HH:MI:SS”。数据库在其存储的日期时间值中没有“格式”,只有输入/输出等文本表示具有格式。
  • 当我说格式时,我会说表示,抱歉,我的英语不是很好。
【解决方案2】:

tl;博士

您正在使用仅限日期的type 来保存日期时间值 - 试图适应square peg into a round hole

如何在 JDBC 数据库中存储日期和时间并同时检索两者?

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

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

您正在使用非常混乱的遗留类。只使用 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.DateCalendarSimpleDateFormat

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

要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

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

从哪里获得 java.time 类?

ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

【讨论】:

    【解决方案3】:

    您正在寻找 DATA_TYPE TIMESTAMP。如果可以的话,你应该改变你的数据库。

    【讨论】:

      猜你喜欢
      • 2013-07-25
      • 2011-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-31
      • 1970-01-01
      • 2011-09-06
      相关资源
      最近更新 更多