'0000-00-00 00:00:00' не может быть представлено как java.sql.Timestamp error

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

 (`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.......

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

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

заблаговременно

Ответ 1

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

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

Ответ 2

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

Факты:

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

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

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

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

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

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

Ответ 3

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

ALTER TABLE table_name MODIFY COLUMN date TIMESTAMP NULL

Ответ 4

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

Ответ 5

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

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;

Ответ 6

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

SET sql_mode = 'NO_ZERO_DATE';

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

Ответ 7

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

0001-01-01 00:00:00

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

Ответ 8

просто введите поле как char

Например: cast (updateate) как char как обновленный

Ответ 9

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

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

Ответ 10

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

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

Ответ 11

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

Ответ: jdbc: mysql://localhost: 3306/database_name? zeroDateTimeBehavior = convertToNull "

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