'0000-00-00 00:00:00' не может быть представлена как Java.язык SQL.Ошибка метки времени

у меня есть таблица базы данных, содержащей даты

 (`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 без изменения таблицы структура?

12 ответов


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

с JDBC:MySQL базы://сервер:3306/вашей база данных?zeroDateTimeBehavior=convertToNull


является ли" дата" '0000-00-00" действительной "датой" не имеет значения для вопроса. "Просто измените базу данных" редко является жизнеспособным решением.

факты:

  • MySQL позволяет дату со значением нулей.
  • эта "функция" широко используется с другими языками.

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

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

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

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

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


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

ALTER TABLE table_name MODIFY COLUMN date TIMESTAMP NULL

добавьте следующий оператор к протоколу 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

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

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;

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

SET sql_mode = 'NO_ZERO_DATE';

Я поместил это в свои описания таблиц, и это решило проблему '0000-00-00 00:00:00' не может быть представлена как Java.язык SQL.Метка


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

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

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

0001-01-01 00:00:00

хотя год 0 был определен в некоторых стандартах, он, скорее всего, будет запутанным, чем полезным IMHO.


просто бросьте поле как char

например: cast (updatedate) как char как updatedate


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

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


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

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


Я считаю, что это полная помощь для тех, кто получает это ниже исключение для перекачки данных через logstash Ошибка: logstash.входной.JDBC-исключение при выполнении запроса jdbc {: exception=>#}

ответ:с JDBC:MySQL базы://имя localhost:3306/имя_базы_данных?zeroDateTimeBehavior=convertToNull"

или если вы работаете с MySQL