'0000-00-00 00:00:00' não pode ser representado como java.sql.Timestamp error


141

Eu tenho uma tabela de banco de dados contendo datas

 (`date` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'). 

Estou usando o MySQL. Às vezes, a partir do programa, os dados são transmitidos sem a data para o banco de dados. Portanto, o valor da data é atribuído automaticamente 0000-00-00 00:00:00 quando os dados da tabela são chamados com a coluna da data em que ocorre o erro

...'0000-00-00 00:00:00' can not be represented as java.sql.Timestamp.......

Tentei passar o valor nulo para a data ao inserir dados, mas ele é atribuído à hora atual.

Existe alguma maneira de obter o ResultSetsem alterar a estrutura da tabela?

Respostas:


302

Você pode usar este URL JDBC diretamente na sua configuração de fonte de dados:

jdbc: mysql: // seu servidor: 3306 / yourdatabase? zeroDateTimeBehavior = convertToNull


2
curioso. Lendo as outras respostas, não há mês zero. O que isso realmente significa?
Thufir

2
Você sabe se existe um equivalente MariaDB para anexar ao meu URL jdbc? jdbc: mariadb: // localhost: 3306 / dev? zeroDateTimeBehavior = convertToNull parece não funcionar para mim.
21417 jeffkempf

Tinha que ser CONVERT_TO_NULL para mim #
routeburn

16

Se a "data" '0000-00-00 "é ou não uma" data "válida é irrelevante para a pergunta." Basta alterar o banco de dados "raramente é uma solução viável.

Fatos:

  • O MySQL permite uma data com o valor de zeros.
  • Esse "recurso" desfruta de amplo uso com outros idiomas.

Então, se eu "apenas mudar o banco de dados", milhares de linhas de código PHP serão quebradas.

Os programadores de Java precisam aceitar a data zero do MySQL e precisam colocar uma data zero de volta no banco de dados, quando outros idiomas dependem desse "recurso".

Um programador que se conecta ao MySQL precisa lidar com datas nulas e 0000-00-00, além de datas válidas. Alterar 0000-00-00 para nulo não é uma opção viável, pois não é mais possível determinar se era esperado que a data fosse 0000-00-00 para gravação no banco de dados.

Para 0000-00-00, sugiro verificar o valor da data como uma sequência e alterá-lo para ("y", 1) ou ("aaaa-MM-dd", 0001-01-01) ou em qualquer nome inválido. Data do MySQL (menos de ano 1000, iirc). O MySQL possui outro "recurso": datas baixas são convertidas automaticamente para 0000-00-00.

Percebo que minha sugestão é uma crítica. Mas o mesmo ocorre com o tratamento de datas do MySQL. E dois julgamentos não acertam. O fato é que muitos programadores terão que lidar com datas zero do MySQL para sempre .


9

Anexe a seguinte instrução ao protocolo JDBC-mysql:

?zeroDateTimeBehavior=convertToNull&autoReconnect=true&characterEncoding=UTF-8&characterSetResults=UTF-8

por exemplo:

jdbc:mysql://localhost/infra?zeroDateTimeBehavior=convertToNull&autoReconnect=true&characterEncoding=UTF-8&characterSetResults=UTF-8

5
Tenha cuidado com essa abordagem. Funciona como um encanto, mas derrubou um servidor de produção para nós (funcionou perfeitamente no dev ...). O que aprendemos é que você vai precisar para citar a string como o & é interpretado como um caractere especial em alguns contextos, dando a linha um significado completamente diferente ...
Techmag

6

Em vez de usar datas falsas como 0000-00-00 00:00:00ou 0001-01-01 00:00:00(a última deve ser aceita por ser uma data válida), altere o esquema do banco de dados para permitir NULLvalores.

ALTER TABLE table_name MODIFY COLUMN date TIMESTAMP NULL

3

Como alternativa, quando você não pode alterar a coluna da data ou atualizar os valores, ou enquanto essas modificações ocorrem, você pode fazer uma seleção usando um caso / quando.

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

Lutei com esse problema e implementei a solução de concatenação de URLs contribuída por @Kushan na resposta aceita acima. Funcionou na minha instância local do MySQL. Mas quando implantei meu aplicativo Play / Scala no Heroku, ele não funcionaria mais. O Heroku também concatena vários argumentos à URL do banco de dados que eles fornecem aos usuários, e esta solução, devido à concatenação de uso de "?" Do Heroku antes de seu próprio conjunto de argumentos, não funcionará. No entanto, encontrei uma solução diferente que parece funcionar igualmente bem.

SET sql_mode = 'NO_ZERO_DATE';

Coloquei isso nas descrições da minha tabela e resolveu o problema de '0000-00-00 00:00:00' não pode ser representado como java.sql.Timestamp


1

você pode tentar assim

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

Não houve ano 0000 e não há mês 00 ou dia 00. Sugiro que você tente

0001-01-01 00:00:00

Enquanto um ano 0 foi definido em alguns padrões, é mais provável que seja confuso do que IMHO útil.


2
Sim, existe um ano 0000. adivinha o ano 0 e temos o ano -1 e o ano -1000. Nunca vi esse calendário gregoriano ou este Anno Domini e mais especialy o calendário gregoriano não tem um ano zero, mas o iso tem eo iso é usado bij computadores ver 0 ano
botenvouwer

@sirwilliam Obrigado por essa qualificação interessante. Parece que o OP queria que o ano 0 fosse tratado como um NULL ou algo que não existe.
precisa saber é o seguinte

1
No MySQL 0000-00-00 00:00:00 é igual a 0. No código legado, pode haver algumas consultas que dependem disso.
Juha Palomäki

0

basta lançar o campo como char

Por exemplo: elenco (atualizado) como char como atualizado


0

Eu sei que essa será uma resposta tardia, mas aqui está a resposta mais correta.

No banco de dados MySQL, altere seu timestampvalor padrão para CURRENT_TIMESTAMP. Se você tiver registros antigos com o valor falso, precisará corrigi-los manualmente.


isso também não vai ajudar.
Sunil Sharma

0

Você pode remover a propriedade "not null" da sua coluna na tabela mysql, se não for necessário. quando você remove a propriedade "not null", não há necessidade de conversão "0000-00-00 00:00:00" e o problema desaparece.

Pelo menos funcionou para mim.


-2

Acredito que seja de ajuda completa para quem está recebendo isso abaixo. Exceção ao bombeamento de dados através do logstash Erro: logstash.inputs.jdbc - Exceção ao executar a consulta JDBC {: exception => #}

Resposta: jdbc: mysql: // localhost: 3306 / database_name? ZeroDateTimeBehavior = convertToNull "

ou se você estiver trabalhando com mysql

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.