首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java从mysql检索格式正确的日期记录

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

Stack Overflow用户
提问于 2015-05-26 14:36:07
回答 1查看 880关注 0票数 0

我有一张用excel填充的桌子。在mysql中运行select查询时,列中的日期根据系统的时区显示。但是,当我使用jdbc连接在java中运行相同的查询时,我并没有获得excel中存在的正确值。我知道这与时区有关。请指导我对select查询所需的更改。

以下查询的结果为NULL。

从mysql.time_zone中选择*; 从mysql.time_zone_name中选择*;

为了详细说明这个问题,当我在mysql服务器上运行时,我获得了一个列的正确日期值。但是,当我通过一个java程序运行相同的值时,我会将值转换为一个不同的时区。

THe java代码如下:

代码语言:javascript
复制
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中提供给我转换的值。请帮帮忙。

代码语言:javascript
复制
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;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-26 15:55:33

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

若要查看连接到MySQL服务器的有效时区,请执行以下操作:

代码语言:javascript
复制
SELECT @@time_zone

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

更改JDBC连接设置

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

代码语言:javascript
复制
useLegacyDatetimeCode=false

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

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

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

注意:,我不是说这是正在报告的问题的解决方案。问题中提供的问题描述非常含糊。任何人都不可能根据问题中的信息推荐一个“解决方案”。

其他方法

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

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

另一个“修补程序”是不返回DATETIME或TIMESTAMP表达式在SELECT中,而是返回具有字符数据类型的表达式。这将使JDBC驱动程序“绕过”任何时区调整在日期时间所做的任何调整(但是.您将返回将映射到String中的值,而不是Date或Calendar对象。例如:

代码语言:javascript
复制
 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会话中的设置。

代码语言:javascript
复制
SELECT @@time_zone
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30461618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档