2014-02-12 2 views
1

Я знаю, что java.sql.Timestamp не принимает '0000-00-00 00:00:00' в качестве значения (без уважительной причины). Но база данных, которую я обрабатываю, была создана с помощью PHP и других инструментов, которые, похоже, не заботятся.проверить отметки времени для '0000-00-00' без литья

, что я хочу

, что я хочу, чтобы скопировать данные из одной базы данных в другую и при этом, что, изменить некоторые значения на лету (как в Timestamp 0000-00-00)

как

I сначала SELECT все данные и поместите каждую строку в Object[]. Он должен быть Object, так как я должен хранить каждое значение в этом массиве, независимо от типа.

позже брошу и преобразовать Object в строку, так что я могу вставить его в базу данных

проблема

, как я сказал, что хочу, чтобы избавиться от '0000-00-00 00:00:00' отметки времени, так что я необходимо проверить, равен ли мой Timestamp'000...'. Но для того, чтобы увидеть, какое значение хранится внутри моего Object, мне нужно наложить его на Timestamp, и вот тут java.sql.SQLException получает предупреждение, чтобы предупредить меня, что 0000.... не может быть отправлен на отметку времени.

код (этот метод возвращает строку, которая получает сцепляется с остальной частью ВСТАВИТЬ-запрос)

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' без литья мой Object к Timestamp?

+0

Как просто изменить свой SQL-запрос в соответствии с вашими условиями? Чтобы вы могли возвращать каждый раз действительную метку времени? Я не уверен в вашем диалоговом диалекте SQL, но, возможно, вы можете решить его с помощью NVL? – bobbel

+0

Вы можете сказать, что драйвер MySQL возвращает NULL для такой отметки времени. –

+0

Вы имеете в виду проверку на 0000 внутри инструкции SELECT? Как SELECT IF (столбец = '0000-00-00', '0000-01-01', столбец) ...? – GameDroids

ответ

2

Вы получаете исключение, потому что в столбце нет метки времени Java, но строка, отличная от Java, содержащая часы YEAR-MONTH-DAY: MINUTES: SECONDS.

Поэтому вам необходимо сериализовать данные в строку Java. В этом случае кастинг не будет работать.

+0

Я попробовал ваше предложение сериализации, но, к сожалению, два 'byte []' не похожи друг на друга. В то время как 'byte []' из строки фактически содержит '0000-00-00 ... ', сериализованный объект всегда дает мне что-то вроде:' srjava.sql.Timestamp & ▒ S eInanosxrjava.util. Datehj KYtxpCX x'. Поэтому даже при сравнении их байтов по байтам они никогда не совпадают:/Тем не менее, хороший подход! Спасибо за вашу идею! – GameDroids

+0

Правильно, пример не работает, потому что он сериализует объект столбца отверстия. Я получу более глубокий взгляд на это ... эти проклятые сериализационные сериализации ...;) – Marcus

1

драйвер MySQL Connector/J JDBC имеет connection property, что позволяет справиться с этим:

zeroDateTimeBehavior 

Что произойдет, когда драйвер столкнется с значениями DATETIME, которые состоят целиком из нулей (используемых MySQL для представления недопустимых дат)? Допустимыми значениями являются «исключение», «круглый» и «convertToNull».

По умолчанию exception

Вы можете попробовать с round или convertToNull.

Смежные вопросы