【问题标题】:Java Retrieve date records in correct format from mysqlJava从mysql中以正确格式检索日期记录
【发布时间】:2015-05-26 14:36:07
【问题描述】:

我有一张由 Excel 填充的表格。当在 mysql 中运行选择查询时,列中的日期根据我系统的时区显示。 但是当我使用 jdbc 连接在 java 中运行相同的查询时,我没有得到 excel 中存在的正确值。 我知道这是时区的问题。请指导我对选择查询需要进行的更改

以下查询的结果为 NULL。

SELECT * FROM mysql.time_zone;

SELECT * FROM mysql.time_zone_name;

只是为了详细说明这个问题,当我在 mysql 服务器中对日期运行选择查询时,我得到了列的正确日期值。但是当我通过 java 程序运行相同的程序时,我会将转换后的值转换为不同的时区。

java代码如下:-

resultList=(List<FosProd>)getEntityManager().createNativeQuery("select fe, count(ldcfe) as Ttlv,  count(IF(ldcfe='PTP',1,NULL)) as PTP,DAY(ludfe) as dayte from (select FOS_NAME as fe,Last_Disposition_Code_FOS as ldcfe,Last_Updated_Date_FOS as ludfe from kic.master_mis group by ALLOCATION_DATE,ALLOCATION_BUCKET,BILLED_ID,CUSTOMER_NAME,TOTAL_OUTSTANDING) as s1 where monthname(ludfe)=\"NOVEMBER\" GROUP BY MONTH(ludfe), DAY(ludfe),fe;", FosProd.class).getResultList();

SELECT 中的 DAY 函数为我提供转换后的值。 请帮忙。

public class FosProd implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Size(max = 50)
    @Column(name = "fe")
    private String fe;
    @Basic(optional = false)
    @NotNull
    @Column(name = "Ttlv")
    private long ttlv;
    @Basic(optional = false)
    @NotNull
    @Column(name = "PTP")
    @Id
    private long ptp;
    @Column(name = "dayte")
    private Integer dayte;

【问题讨论】:

  • Excel 中有什么内容?数据库中有什么?那么你在 Java 中得到了什么?任何可能为您的问题提供一些线索的东西????
  • Excel 是一个 Msexcel 电子表格。 DB是mysql数据库。只是为了详细说明这个问题,当我在 mysql 服务器中对日期运行选择查询时,我得到了正确的日期值。但是当我通过 java 程序运行相同的程序时,我得到了转换后的值。
  • 如果你包含java代码会很有帮助。

标签: java mysql jpa timezone


【解决方案1】:

很可能是 JDBC 驱动程序“帮助”您,改变了 DATETIME/TIMESTAMP 值,因为 MySQL 服务器和 JVM 的时区设置不同,它正在对这些值进行调整。

要查看连接到 MySQL 服务器的有效时区:

SELECT @@time_zone

将其与 JVM 使用的时区进行比较。如果它们相同,则 JDBC 驱动程序不应对这些值进行任何调整。如果这些不同,则很可能是 JDBC 驱动程序正在对这些值进行时区调整。


更改 JDBC 连接设置

我们必须在 JDBC 连接 (MySQL J/Connector) url 上配置一些选项来阻止 JDBC 驱动程序进行脑死时区转换,我认为我们所做的最重要的改变是:

useLegacyDatetimeCode=false

我认为我们还必须设置 noTimezoneConversionForDateType=true,因此不会对纯 DATE 数据类型进行时区调整。

我相信我们还对 SQL 数据类型和 JDBC 数据类型之间的自定义映射进行了一些实验。但我不认为这些最终成为我们解决方案的一部分。)

(显然,如果您使用 MariaDB JDBC 驱动程序,这将不适用;我们只是猜测您使用的是 MySQL J/Connector。)

注意:我并不是说这是解决所报告问题的方法。问题中提供的问题描述非常含糊不清。任何人都无法根据问题中的信息推荐“解决方案”。


其他方法

这不是解决问题的唯一方法,还有其他几种方法,这些方法的适用性实际上取决于您的要求以及您要达到的目标。

一个“简单”按钮(可能不是最适合您的解决方案)是修改 JVM 的时区以匹配 MySQL 服务器的时区。但是...这将影响整个船载,而不仅仅是 JDBC 驱动程序所做的时区调整。

另一个“补丁”是SELECT 中返回DATETIMETIMESTAMP 表达式,而是返回具有字符 数据类型的表达式。这将使 JDBC 驱动程序“绕过”在 DATETIME 进行的任何时区调整,(但是......您将返回将映射到 String,而不是 DateCalendar 对象的值。例如

 SELECT DATE_FORMAT(mydatecol,'%Y-%m-%d %h:%i:%s') AS mydate_string
   FROM

以类似的方式,您可以返回UNIX_TIMESTAMP(mydatecol),这将返回一个整数(自UTC 1970 年1 月1 日午夜以来的秒数)。返回的值将由 MySQL 会话中的 time_zone 变量的设置来通知。)

同样,这可能不是最合适的解决方案。

我们假设您在对 MySQL 服务器运行查询时看到“正确”的 DATETIME 值。这里最重要的是了解 MySQL 会话中 time_zone 变量的设置。

SELECT @@time_zone

【讨论】:

  • SELECT @@time_zone 返回 SYSTEM。我也尝试将我的连接参数更改添加到jdbc:mysql://localhost:3306/kic?noTimezoneConversionForDateType=true&amp;useLegacyDatetimeCode=false,但我仍然面临同样的问题。我不确定如何获取 JVM 的时区
  • 成功了。我将查询更改为 JPA 类型的查询,并且 DAY 函数返回了正确的值。不知道为什么原生查询没有为我提供正确的值。感谢您提供的信息.. 它在其他情况下确实对我有所帮助...
猜你喜欢
  • 1970-01-01
  • 2022-01-24
  • 2019-05-16
  • 2020-05-18
  • 2019-04-25
  • 2010-09-19
  • 1970-01-01
  • 1970-01-01
  • 2018-04-03
相关资源
最近更新 更多