2015-05-26 90 views
0

我有一個由excel填充的表格。列中的日期顯示根據我的系統的時區選擇查詢在mysql中運行。 但是,當我使用jdbc連接在java中運行相同的查詢時,我沒有得到正確的值,因爲它出現在Excel中。 我知道這是時區問題。請指導我需要爲選擇查詢所做的更改Java以正確的格式從mysql中檢索日期記錄

以下查詢的結果爲NULL。

SELECT * FROM mysql.time_zone;

SELECT * FROM mysql.time_zone_name;

只是爲了詳細說明這個問題,當我在mysql服務器上運行日期選擇查詢時,我得到了列的正確日期值。但是當我通過Java程序運行相同的時候,我將轉換後的值轉換爲不同的時區。

Java代碼如下: - 在SELECT

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(); 

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

是什麼在Excel中?數據庫中有什麼?你在Java中得到什麼?任何可能爲你的問題提供一些線索的東西? –

+0

Excel是Msexcel電子表格。 DB是mysql數據庫。只是爲了詳細說明這個問題,當我在mysql服務器上運行日期選擇查詢時,我得到了正確的日期值。但是,當我通過一個Java程序運行相同的,我得到轉換後的值。 – rahul

+0

如果您包含java代碼,將會很有幫助。 – Thierry

回答

0

有可能的,它的JDBC驅動程序「幫助」你出去,改變DATETIME/TIMESTAMP值,因爲它是作出調整,因爲在MySQL服務器和JVM的時區設置的不同的這些值。

要查看效果時區爲你連接到MySQL服務器:

SELECT @@time_zone 

與此相比,由JVM使用的時區。如果這些是相同的,那麼JDBC驅動程序不應該對這些值進行任何調整。如果這些不同,那麼JDBC驅動程序可能會對這些值進行時區調整。


更改JDBC連接設置

我們不得不配置JDBC連接上一些選項(MySQL的焦耳/連接器)鏈接直接從做腦死亡時區轉換停止JDBC驅動程序,我覺得最我們取得了重要的變化是:

useLegacyDatetimeCode=false 

我認爲,我們還必須設置noTimezoneConversionForDateType=true所以時區調整were't純DATE數據類型做出。

我相信我們也對SQL數據類型和JDBC數據類型之間的自定義映射做了一些嘗試。但我認爲這些並不是我們解決方案的一部分。)

(顯然,如果您使用的是MariaDB JDBC驅動程序,這不適用;我們只是猜測您正在使用MySQL J /連接器。)

注意:我不是說這是解決報告問題的解決方案。問題中提供的問題描述是非常模糊。任何人都不可能根據問題中的信息推薦「解決方案」。


其他方法

這並不是解決問題的唯一辦法,也有這些方法的其他幾個avenuesl適用性真的取決於你的需求以及你正在努力實現。

一個「簡單」按鈕(可能是而不是最適合您的解決方案)將是修改JVM的時區以匹配MySQL服務器的時區。但是......這將影響整個船載,而不僅僅是由JDBC Driver進行的時區調整。

另一個「補丁」將在SELECT返回DATETIMETIMESTAMP表達式,但返回有字符數據類型,而不是表達式。這將使JDBC驅動程序「搭橋」任何時區調整是在DATETIME做的,(但是...你會返回將被映射到String,不DateCalendar對象的值。例如

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

在類似的情況下,你可以返回UNIX_TIMESTAMP(mydatecol),這將返回一個整數(自1970年1月1日午夜以來的秒數)。返回的值將通過在MySQL中設置time_zone變量會議。)

同樣,這可能不是最合適的解決方案。

我們假設您在針對MySQL服務器運行查詢時看到「正確的」DATETIME值。這裏最重要的是知道MySQL會話中time_zone變量的設置。

SELECT @@time_zone 

+0

'SELECT @@ time_zone'返回SYSTEM。另外我試圖添加更改我的連接參數到'jdbc:mysql:// localhost:3306/kic?noTimezoneConversionForDateType = true&useLegacyDatetimeCode = false'但仍然面臨同樣的問題。我不知道如何獲得JVM的時區 – rahul

+0

它的工作。我將查詢更改爲JPA類型的查詢,並且DAY函數返回了正確的值。不知道爲什麼本機查詢不能提供正確的值。感謝您的信息..它確實幫助我在其他情況下,但... – rahul