it-swarm.com.ru

"0000-00-00 00:00:00" не может быть представлено как ошибка Java.sql.Timestamp

У меня есть таблица базы данных с датами 

 (`date` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'). 

Я использую MySQL. Из программы иногда данные передаются без даты в базу данных. Таким образом, значение даты автоматически присваивается 0000-00-00 00:00:00 При вызове данных таблицы со столбцом даты выдается ошибка

...'0000-00-00 00:00:00' can not be represented as Java.sql.Timestamp.......

Я пытался передать нулевое значение в дату при вставке данных, но он получает присвоение на текущее время.

Есть ли способ получить ResultSet без изменения структуры таблицы?

131
Chamila Adhikarinayake

Вы можете использовать этот URL JDBC непосредственно в конфигурации источника данных:

jDBC: MySQL: // ваш_сервер: 3306/yourdatabase zeroDateTimeBehavior = convertToNull

266
Kushan

Является ли «date» «0000-00-00» действительной «date», не имеет отношения к вопросу . «Просто измените базу данных» редко является жизнеспособным решением.

Факты: 

  • MySQL допускает дату со значением нулей.
  • Эта «особенность» широко используется с другими языками.

Так что, если я «просто изменю базу данных», тысячи строк кода PHP сломаются.

Java-программисты должны принять MySQL с нулевой датой и они должны поместить нулевую дату обратно в базу данных, когда другие языки полагаются на эту "особенность".

Программист, подключающийся к MySQL, должен обрабатывать null и 0000-00-00, а также допустимые даты. Изменение 0000-00-00 на ноль не является жизнеспособным вариантом, потому что тогда вы больше не сможете определить, должна ли была быть дата 0000-00-00 для обратной записи в базу данных.

Для 0000-00-00 я предлагаю проверить значение даты в виде строки, а затем изменить ее на ("y", 1) или ("yyyy-MM-dd", 0001-01-01) или на любое недопустимое значение. Дата MySQL (меньше года 1000, iirc). MySQL имеет еще одну «особенность»: низкие даты автоматически конвертируются в 0000-00-00.

Я понимаю, что мое предложение - клудж. Но то же самое относится и к обработке даты в MySQL. А два клуджа делают это неправильно. В том-то и дело, что многим программистам придется обрабатывать MySQL с нулевыми датами навсегда .

12
UnlimitedInfinity

Добавьте следующий оператор к протоколу JDBC-mysql:

?zeroDateTimeBehavior=convertToNull&autoReconnect=true&characterEncoding=UTF-8&characterSetResults=UTF-8

например:

jdbc:mysql://localhost/infra?zeroDateTimeBehavior=convertToNull&autoReconnect=true&characterEncoding=UTF-8&characterSetResults=UTF-8
6
Yogesh H Bhosale

Вместо использования фиктивных дат, таких как 0000-00-00 00:00:00 или 0001-01-01 00:00:00 (последняя должна приниматься как действительная дата), измените схему базы данных, чтобы разрешить значения NULL.

ALTER TABLE table_name MODIFY COLUMN date TIMESTAMP NULL
6
npe

В качестве крайнего поворота, когда вы не можете изменить столбец даты или обновить значения, или пока эти изменения происходят, вы можете сделать выбор, используя регистр/когда.

SELECT CASE ModificationDate WHEN '0000-00-00 00:00:00' THEN '1970-01-01 01:00:00' ELSE ModificationDate END AS ModificationDate FROM Project WHERE projectId=1;
3
VCeron

ты можешь попробовать вот так

ArrayList<String> dtlst = new ArrayList<String>();
String qry1 = "select dt_tracker from gs";

Statement prepst = conn.createStatement();
ResultSet rst = prepst.executeQuery(qry1);
while(rst.next())
{
    String dt = "";
    try
    {
        dt = rst.getDate("dt_tracker")+" "+rst.getTime("dt_tracker");
    }
    catch(Exception e)
    {
        dt = "0000-00-00 00:00:00";
    }

    dtlst.add(dt);
}
1
13hola

Я боролся с этой проблемой и реализовал решение конкатенации URL, предоставленное @Kushan в принятом ответе выше. Это работало в моем локальном экземпляре MySql. Но когда я развернул свое приложение Play/Scala в Heroku, оно перестало работать. Heroku также объединяет несколько аргументов с URL-адресом БД, который они предоставляют пользователям, и это решение из-за использования Heroku конкатенации "?" прежде чем их собственный набор аргументов, не будет работать. Однако я нашел другое решение, которое, кажется, работает одинаково хорошо.

SET sql_mode = 'NO_ZERO_DATE';

Я поместил это в мои описания таблиц, и это решило проблему «0000-00-00 00:00:00» не может быть представлен как Java.sql.Timestamp

1
Aqume

просто бросить поле как символ

Например: приведение (обновление) как символ как обновление

0
Santhosh Rajkumar

Там не было года 0000 и нет месяца 00 или дня 00. Я предлагаю вам попробовать 

0001-01-01 00:00:00

Хотя в некоторых стандартах был определен год 0, это скорее сбивает с толку, чем полезно ИМХО.

0
Peter Lawrey

Вы можете удалить свойство "not null" из вашего столбца в таблице MySQL, если это не нужно. когда вы удаляете свойство "not null", нет необходимости в преобразовании "0000-00-00 00:00:00", и проблема исчезает.

По крайней мере, работал на меня.

0
Celik

Я знаю, что это будет запоздалый ответ, однако вот самый правильный ответ.

В базе данных MySQL измените значение по умолчанию timestamp на CURRENT_TIMESTAMP. Если у вас есть старые записи с поддельным значением, вам придется вручную исправить их.

0
PeakGen