2014-02-12 67 views
1

我知道java.sql.Timestamp不接受'0000-00-00 00:00:00'作爲一個值(有很好的理由)。但我正在處理的數據庫是使用PHP和其他工具創建的,但似乎並不在意。檢查'0000-00-00'的時間戳而不鑄造

我想

我要的是複製數據從一個數據庫到另一個,而這樣做,動態更改(如Timestamp 0000-00-00

如何

一些值

我先把SELECT整個數據放在Object[]的每一行。它需要是Object,因爲我必須存儲該數組中的每個值,而不管類型。

後,我會投和轉換Object爲String,所以我可以將它插入到數據庫

問題

,我說我要擺脫'0000-00-00 00:00:00'時間戳,所以我需要檢查我的Timestamp是否等於'000...'。 但爲了看看我的Object裏面存儲了什麼值,我需要將它轉換爲Timestamp,這就是java.sql.SQLException被拋出的地方,以警告我0000....不能被轉換爲時間戳。

代碼(此方法返回獲取與INSERT-查詢的其餘部分連接起來的String)

Object column = row[columnIndex]; // column contains the value I want to check 

if (column == null) {    // when its a NULL I insert my dummy value 
    return "'0000-01-01 00:00:00'"; 
} 
// here is the problem: to check if the value is 0000... I need to cast the object 
// to a Timestamp.. but that's not allowed 
if (((Timestamp) column).toString().equalsIgnoreCase("0000-00-00 00:00:00")) { 
    return "'0000-01-01 00:00:00'"; 
}  

// when its neither null nor '0000... ' return the value as it is 
String timestampString = ((Timestamp) column).toString(); 
return "'" + timestampString + "'"; 

很抱歉的長說明。

短缺問題

如何檢查是否有時間戳等於'0000-00-00 00:00:00'沒有鑄造我ObjectTimestamp

+0

那麼簡單地改變你的SQL語句以適合你的條件呢?所以你可以每次返回一個有效的時間戳?我不確定你的SQL方言,但也許你可以用'NVL'解決它? – bobbel

+0

您可以告訴MySQL驅動程序在這樣的時間戳返回NULL –

+0

您的意思是檢查SELECT語句中的0000?像SELECT IF(column ='0000-00-00','0000-01-01',列)...? – GameDroids

回答

2

由於該列沒有Java時間戳,而是包含YEAR-MONTH-DAY HOURS:MINUTES:SECONDS的非Java字符串,您將得到該異常。

因此,您需要將數據序列化爲Java字符串。在這種情況下鑄造不起作用。

+0

我試過你的序列化建議,但不幸的是兩個'byte []'看起來不一樣。雖然String的byte []實際上包含''0000-00-00 ...',但序列化的Object總是給我類似於''srjava.sql.Timestamp&▒ S eInanosxrjava.util。 Datehj KYtxpCX x'。所以即使比較他們逐字節他們永遠不會匹配:/仍然,好方法!感謝您的想法! – GameDroids

+0

對,這個例子沒有起作用,因爲它序列化了空洞列對象。我會更深入地研究這些......那些交叉平臺序列化...;) – Marcus

1

MySQL的連接器/ J JDBC驅動程序有一個connection property,使您可以處理這個問題:

zeroDateTimeBehavior 

當驅動程序遇到完全由零組成的DATETIME值(由MySQL用來表示無效日期)時會發生什麼?有效值是「例外」,「輪」和「convertToNull」。

默認爲exception

你可能想嘗試roundconvertToNull