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

时间:2015-05-26 14:36:08

标签: java mysql jpa timezone

我有一张由excel填充的表格。当在mysql中运行select查询时,列中的日期根据我的系统时区显示。 但是当我使用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;

1 个答案:

答案 0 :(得分:0)

可能,它是JDBC驱动程序&#34;帮助&#34;你出去了,改变了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。)

注意:我并不是说这是报告问题的解决方案。问题中提供的问题描述是非常模糊。任何人都没有办法推荐一个&#34;解决方案&#34;根据问题中的信息。

其他方法

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

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

另一个&#34;补丁&#34;将{em>不返回DATETIME中的TIMESTAMPSELECT表达式,而是返回具有字符数据类型的表达式。这将使JDBC驱动程序&#34;绕过&#34;任何时区调整都在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变量的设置来通知。)

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

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

SELECT @@time_zone