'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:/ / yourserver: 3306 / yourdatabase?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), или ("yyyy-MM-dd", 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, когда вы не можете сделать изменение в столбце даты или обновить значения, или в то время как эти изменения происходят, вы можете сделать выбор с помощью 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;
Я боролся с этой проблемой и реализовал решение конкатенации URL, внесенное @Kushan в принятый ответ выше. Он работал в моем локальном экземпляре MySql. Но когда я развернул свое приложение Play / Scala в Heroku, оно больше не будет работать. Heroku также объединяет несколько args в URL-адрес БД, который они предоставляют пользователям, и это решение, из-за использования Heroku конкатенации "?"прежде чем их собственный набор аргументов, не будет работать. Однако я нашел другое решение, которое, кажется, работает так же хорошо.
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.
Я знаю, что это будет поздний ответ, однако вот самый правильный ответ.
в базе данных MySQL измените свой
timestampзначение по умолчанию вCURRENT_TIMESTAMP. Если у вас есть старые записи с поддельным значением, вам придется вручную исправить их.
вы можете удалить свойство "not null" из вашего столбца в таблице mysql, если это не необходимо. при удалении свойства " not null "нет необходимости в преобразовании" 0000-00-00 00:00:00 " и проблема исчезла.
по крайней мере, работал на меня.
Я считаю, что это помощь полная для тех, кто получает это ниже исключение на прокачку данных через logstash Ошибка: logstash.входной.jdbc-исключение при выполнении запроса JDBC {: exception=>#}
ответ:jdbc: mysql:/ / localhost: 3306 / database_name?zeroDateTimeBehavior=convertToNull"
или если вы работаете с MySQL
Comments