我有一张由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;
答案 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
中的TIMESTAMP
或SELECT
表达式,而是返回具有字符数据类型的表达式。这将使JDBC驱动程序&#34;绕过&#34;任何时区调整都在DATETIME上进行,(但是......您将返回将映射到String
而不是Date
或Calendar
对象的值。例如
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