Java 从 mysql 中检索格式正确的日期记录

Java Retrieve date records in correct format from mysql

我有一个 table,其中填充了一个 excel。当 select 查询在 mysql 中为 运行 时,列中的日期根据我系统的时区显示。 但是当我 运行 在 java 中使用 jdbc 连接进行相同的查询时,我没有得到 excel 中存在的正确值。 我知道这是时区的问题。请指导我对 select 查询

需要进行的更改

以下查询的结果为 NULL。

SELECT * FROM mysql.time_zone;

SELECT * FROM mysql.time_zone_name;

只是为了详细说明这个问题,当我 运行 在 mysql 服务器中查询 select 日期时,我得到了列的正确日期值。但是当我通过 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;

可能是 JDBC driver "helping" 你出局了,改变了 DATETIME/TIMESTAMP 值,因为它正在对这些值进行调整,因为MySQL 服务器和 JVM 的时区设置不同。

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

SELECT @@time_zone

将其与 JVM 使用的时区进行比较。如果那些 相同 ,那么 JDBC driver 不应该对值进行任何调整。如果这些不同,则可能是 JDBC driver 正在对这些值进行时区调整。


更改JDBC 连接设置

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

useLegacyDatetimeCode=false

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

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

(显然,如果您使用的是 MariaDB JDBC driver,这将不适用;我们只是猜测您正在使用 MySQL J/Connector.)

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


其他方法

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

一个 "easy" 按钮(可能 不是 最适合您的解决方案)是修改 JVM 的时区以匹配 MySQL 服务器。但是......这将影响整个船载量,而不仅仅是 JDBC Driver.

所做的时区调整

另一个 "patch" 将 而不是 return DATETIMETIMESTAMP SELECT 中的表达式,但是 return 表达式具有 character 数据类型。这将使 JDBC driver "bypass" 任何时区调整都在 DATETIME 进行,(但是......你将 returning 值映射到 String,而不是 DateCalendar objects。例如

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

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

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

我们假设您在 运行 对 MySQL 服务器的查询时看到 "correct" DATETIME 值。这里最重要的是了解 MySQL session.

time_zone 变量的设置
SELECT @@time_zone