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


145

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

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

Ответы:


308

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

jdbc: mysql: // ваш сервер: 3306 / ваша база данных? zeroDateTimeBehavior = convertToNull


2
любопытно. Читая другие ответы, да, нулевого месяца нет. Что это на самом деле означает?
Туфир

2
Вы знаете, есть ли эквивалент MariaDB для добавления к моему URL-адресу jdbc? jdbc: mariadb: // localhost: 3306 / dev? zeroDateTimeBehavior = convertToNull, похоже, у меня не работает.
jeffkempf 01

Должен был быть CONVERT_TO_NULL для меня
routeburn

16

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

Факты:

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

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

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

Программист, подключающийся к MySQL, должен обрабатывать null и 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.

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


9

Добавьте следующий оператор к протоколу 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
Будьте осторожны с этим подходом. Он работает как шарм, но он сломал у нас производственный сервер (хотя отлично работал в dev ...). Мы узнали, что вам нужно заключить строку в кавычки, поскольку & в некоторых контекстах интерпретируется как специальный символ, придающий строке совершенно другое значение ...
Techmag

6

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

ALTER TABLE table_name MODIFY COLUMN date TIMESTAMP NULL

3

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

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;

1

Я боролся с этой проблемой и реализовал решение конкатенации 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

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

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

0

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

0001-01-01 00:00:00

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


2
Да, есть год 0000. Фактически это год 0, у нас есть год -1 и год -1000. Никогда не видел этот григорианский календарь или этот Anno Domini и, что более важно, в григорианском календаре нет нулевого года, но есть iso, и iso используется bij компьютеры видят 0 год
botenvouwer

@sirwilliam Спасибо за интересную квалификацию. Похоже, OP хотел, чтобы год 0 рассматривался как NULL или что-то, чего не существует.
Питер Лоури

1
В MySQL 0000-00-00 00:00:00 равно 0. В устаревшем коде могут быть некоторые запросы, которые полагаются на это.
Юха Паломяки


0

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

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


это тоже не поможет.
Сунил Шарма

0

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

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


-2

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

Ответ: jdbc: mysql: // localhost: 3306 / имя_базы_данных? ZeroDateTimeBehavior = convertToNull "

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.