我有一张用excel填充的桌子。在mysql中运行select查询时,列中的日期根据系统的时区显示。但是,当我使用jdbc连接在java中运行相同的查询时,我并没有获得excel中存在的正确值。我知道这与时区有关。请指导我对select查询所需的更改。
以下查询的结果为NULL。
从mysql.time_zone中选择*; 从mysql.time_zone_name中选择*;
为了详细说明这个问题,当我在mysql服务器上运行时,我获得了一个列的正确日期值。但是,当我通过一个java程序运行相同的值时,我会将值转换为一个不同的时区。
THe 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中提供给我转换的值。请帮帮忙。
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;发布于 2015-05-26 15:55:33
很可能是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驱动程序所做的时区调整。
另一个“修补程序”是不返回DATETIME或TIMESTAMP表达式在SELECT中,而是返回具有字符数据类型的表达式。这将使JDBC驱动程序“绕过”任何时区调整在日期时间所做的任何调整(但是.您将返回将映射到String中的值,而不是Date或Calendar对象。例如:
SELECT DATE_FORMAT(mydatecol,'%Y-%m-%d %h:%i:%s') AS mydate_string
FROM类似地,您可以返回UNIX_TIMESTAMP(mydatecol),这将返回一个整数(自1970年1月1日午夜开始的秒数)。)通过在time_zone会话中设置MySQL变量来通知返回的值。)
同样,这可能不是最合适的解决方案。
假设您在对MySQL服务器运行查询时看到了“正确”的日期时间值。这里最重要的是了解time_zone变量在MySQL会话中的设置。
SELECT @@time_zonehttps://stackoverflow.com/questions/30461618
复制相似问题