обработка ДАТЫ И ВРЕМЕНИ оценивает 0000-00-00 0:00:00 в JDBC

Отвечает в комментариях Engineero.

Удаление начальных и конечных 0 - это то же самое, что сказать, что нужно начинать и заканчивать 1. Для этого возьмите перестановку с N-2 и затем закрепите 1 на концах.

Спасибо!

РЕД. привести к удовлетворительному ответу.

Я создал итеративное приложение. Мое последнее приложение - cpp, но я сделал быстрый прототип на python в качестве доказательства концепции. Заметьте, что в приложении cpp вместо добавления в мой список я буду вызывать отдельную функцию, которая использует перестановку. Не стесняйтесь критиковать, чтобы сделать его более эффективным.

import copy
aList = []

def initA(sz=10):
        return [1]+[0]*(sz-2)+[1];

def iterA(buff,level,ix):
    if (level >0):
        for i in range (level,ix):
            a=copy.deepcopy(buff)
            a[i] = 1;
            if level ==1:
                aList.append(a)
            iterA(a,level-1,i);

N=6;
K=10;
for i in range (N-2,K):
    a=initA(i+1)
    a = iterA(a,N-2,i)
print (aList);
83
задан Jason S 23 April 2009 в 20:02
поделиться

5 ответов

Я наткнулся на это, пытаясь решить ту же проблему. В установке, с которой я работаю, используются JBOSS и Hibernate, поэтому мне пришлось сделать это по-другому. В базовом случае вы должны иметь возможность добавить zeroDateTimeBehavior = convertToNull к URI вашего соединения в соответствии с этой страницей свойств конфигурации .

Я нашел другие предложения по всему миру, касающиеся размещения этот параметр в конфигурации вашего гибернации:

В hibernate.cfg.xml :

<property name="hibernate.connection.zeroDateTimeBehavior">convertToNull</property>

В hibernate.properties :

hibernate.connection.zeroDateTimeBehavior=convertToNull

Но мне пришлось поместить его в свой mysql-ds.xml файл для JBOSS как:

<connection-property name="zeroDateTimeBehavior">convertToNull</connection-property>

Надеюсь, это кому-то поможет. :)

82
ответ дан 24 November 2019 в 08:43
поделиться

Я хочу сказать, что мне просто нужна необработанная строка DATETIME, чтобы я мог сам разобрать ее как есть.

Это заставляет меня думать, что ваш «обходной путь» - это не обходной путь, а в Фактически, единственный способ получить значение из базы данных в ваш код:

SELECT CAST(add_date AS CHAR) as add_date

Кстати, еще несколько замечаний из документации MySQL:

MySQL Ограничения на неверные данные :

До MySQL 5.0.2, MySQL прощает недопустимые или неправильные значения данных и приводит их к допустимым значениям для ввода данных. В MySQL 5.0.2 и выше это остается поведением по умолчанию, но вы можете изменить режим SQL сервера, чтобы выбрать более традиционную обработку некорректных значений, чтобы сервер отклонял их и прерывал оператор, в котором они встречаются.

[..]

Если вы попытаетесь сохранить NULL в столбце, который не принимает значения NULL, произойдет ошибка для однострочных операторов INSERT. Для многострочных операторов INSERT или для операторов INSERT INTO ... SELECT MySQL Server сохраняет неявное значение по умолчанию для типа данных столбца.

MySQL 5.x Типы даты и времени :

MySQL также позволяет хранить «0000-00-00» как «фиктивную дату» (если вы не используете режим SQL NO_ZERO_DATE). В некоторых случаях это более удобно (и использует меньше места для данных и индекса), чем использование значений NULL.

[..]

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

11
ответ дан 24 November 2019 в 08:43
поделиться

Я предлагаю вам использовать null для представления нулевого значения.

Какое исключение вы получаете?

BTW:

Нет года с названием 0 или 0000. (Хотя некоторые даты допускают этот год)

И нет 0 месяца года или 0 дня месяца. (Что может быть причиной вашей проблемы)

3
ответ дан 24 November 2019 в 08:43
поделиться
DATE_FORMAT(column name, '%Y-%m-%d %T') as dtime

Используйте это, чтобы избежать ошибки. Он возвращает дату в строковом формате, а затем вы можете получить ее в виде строки.

resultset.getString("dtime");

На самом деле это НЕ работает. Даже если вы вызываете getString. Внутренне mysql все еще пытается сначала преобразовать его в дату.

в com.mysql.jdbc.ResultSetImpl.getDateFromString (ResultSetImpl.java:2270)

~ [mysql-connector-java-5.1.15.jar: na] в com.mysql.jdbc.ResultSetImpl.getStringInternal (ResultSetImpl.java:5743)

~ [mysql-connector-java-5.1.15.jar: na] в com.mysql.jdbc.ResultSetImpl.getString (ResultSetImpl.java : 5576)

~ [mysql-connector-java-5.1.15.jar: na]

6
ответ дан 24 November 2019 в 08:43
поделиться

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

jdbc:mysql://yourserver:3306/yourdatabase?zeroDateTimeBehavior=convertToNull

Редактировать:

Источник: Руководство по MySQL

Дата с нулевыми компонентами (0000-00-00 .. .) - Эти значения не могут быть надежно представлены в Java. Connector / J 3.0.x всегда преобразовывал их в NULL при чтении из ResultSet.

Connector / J 3.1 по умолчанию выдает исключение при обнаружении этих значений, поскольку это наиболее правильное поведение в соответствии со стандартами JDBC и SQL. Это поведение можно изменить с помощью свойства конфигурации zeroDateTimeBehavior. Допустимые значения:

  • исключение (по умолчанию), которое вызывает SQLException с SQLState S1009.
  • convertToNull , который возвращает NULL вместо даты.
  • round , который округляет дату до ближайшего значения, равного 0001-01-01.

Обновление: Александр сообщил об ошибке, влияющей на mysql-connector-5.1.15 в этой функции. См. ИЗМЕНЕНИЯ на официальном сайте .

121
ответ дан 24 November 2019 в 08:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: