Ir para conteúdo
Fórum Script Brasil
  • 0

Campo Data So Funciona em VARCHAR


Añd®é™

Pergunta

Minha gente, boa noite a todos, a algum tempo venho me enpenhando para consertar um livro de visitas que retirei em um site que achei no Google, essa investida me custou tempo e me deu muito dor de cabeça, mais no final o resultado foi satisfatório, mais como todo sistema não testado, sempre encontramos um calcanhar de "akires" e o desse livro de visitas foi que ele só funciona perfeitamente em VARCHAR, em fim seria até interessante se funcionasse integralmente. Mas o detalhe da coisa é que só funciona certo durante o primeiro mês, após isso ele passa a agrupar as mensagens somente pelos dia do mês:

Ex:

02/01/2010

02/02/2010

02/03/2010

Isso causa uma embolação não valida para nenhum livro de visitas.

Ai vem a pergunta, qual seria a solução, mudar o campo data para DATE ou DATETIME, claro que qualquer um logo pensaria nisso, só que ao fazer, ele causa uma perca de informações permanete, transformando as datas na seguinte abreviatoria

Ex:

0000/00/00

Ou seja além de modificar, não se consegue recuperar os dados se retornamos para VARCHAR, ou seja não existe uma solução ao meu ver.

Em fim, caso alguém saiba como proceder em um caso desse, por favor me postem a solução, já é o terceiro tópico que eu abro sobre esse assunto, já refiz esse livro de visitas mais de 20 vezes, e esse problema persiste em me assombrar.

Qualquer informação que nescessitem para analise estarei postando aos olhos de vocês.

Sem Mais Obrigado a Todos!!

Forte Abraço!

Link para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 0

Oi, 'Anãod®é™'

Este tópico é continuação do anterior e vou agrupá-lo àquele.

Você falou:

Ai vem a pergunta, qual seria a solução, mudar o campo data para DATE ou DATETIME, claro que qualquer um logo pensaria nisso, só que ao fazer, ele causa uma perca de informações permanete, transformando as datas na seguinte abreviatoria

Ex:

0000/00/00

Ou seja além de modificar, não se consegue recuperar os dados se retornamos para VARCHAR, ou seja não existe uma solução ao meu ver.

Você não tomou as precauções necessárias para fazer este procedimento simples e que você diz não haver solução.

Por causa desta falta de precaução não foi possível orientá-lo de forma adequada.

Respondendo sua pergunta original de outra forma para que você não ocorra em erros novamente.

Faça BACKUP de sua base de dados antes de prosseguir.

São quatro passos:

Primeiro crie um campo data com outro nome na tabela que você quer alterar o campo.

ALTER TABLE tabela
ADD COLUMN minhanovacoluna date;
Segundo determine o formato da data no campo original e faça um update no campo novo com a data original transformada. O exemplo abaixo segue o modelo informado no post anterior.
Verifique o manual do MySQL para o uso da função DATE_FORMAT
UPDATE minhatabela
SET minhanovacoluna = FORMAT_DATE(minhaantigacoluna, '%m/%d/%A');
Terceiro verifique se os dados estão ok e drop o campo original. Só faça o DROP se os dados estiverem OK. Se não estiverem poste novamente para que possamos te orientar.
ALTER TABLE minhatabela
DROP COLUMN minhaantigacoluna;
Quarto renomeie o campo novo com o nome do original.
ALTER TABLE minhatabela
CHANGE minhanovacoluna  minhaantigacoluna date;

Link para o comentário
Compartilhar em outros sites

  • 0

Ok, então vamos por partes!

Fiz o Backup de toda a tabela no MySQL

então criei uma outra coluna com o nome DATAPROGRESSIVA que ficou da seguinte forma

ALTER TABLE `mural` ADD `dateprogressiva` DATE NOT NULL AFTER `data`;
Não sei se está de acordo com o que você falou mais foi o que o SQL me retornou. Dai então fiz a atualização no campo original transformando o VARCHAR em DATE como você sugere e ficou da seguinte forma
ALTER TABLE `mural` CHANGE `data` `data` DATE NOT NULL

A primeira vista me parece diferente do que voê postou mais em fim pode ser uma resposta diferente para cada tipo de trabalho

Quando fui conferir estava tudo no formato 0000/00/00 ou seja o erro persiste e nem tentei fazer a terceira parte do sugerido.

Veja a imagem e note que estou seguindo a risca o que você me vem passando mais parece que não dá certo

imagem.GIF

Vamos supor que eu estivesse disposto a perder todas as informações e começar do zero, como eu teria que proceder? Pois não tenho muito dados armazenados, ppoderia entrar com uma tabela nova já alterada para não dar esse erro?

Também gostaria de fazer uma ressalva, que entrei no manual do SQL ele até relata sobre o erro que esta dando no meu caso, mais não me da a solução, diz apenas que pode ser algum valor não reconhecido pelo MySQL.

Editado por Añd®é™
Link para o comentário
Compartilhar em outros sites

  • 0
Fiz o Backup de toda a tabela no MySQL
Fez correto.

então criei uma outra coluna com o nome DATAPROGRESSIVA que ficou da seguinte forma

ALTER TABLE `mural` ADD `dateprogressiva` DATE NOT NULL AFTER `data`;
Não sei se está de acordo com o que você falou mais foi o que o SQL me retornou.
Correto.
Dai então fiz a atualização no campo original transformando o VARCHAR em DATE como você sugere e ficou da seguinte forma
ALTER TABLE `mural` CHANGE `data` `data` DATE NOT NULL
Errado. Nesta parte eu fui claro na instrução anterior. Você pulou algumas instruções. Leia de novo o post anterior. Veja abaixo a instrução que era para ter sido feita e não foi.
Segundo determine o formato da data no campo original e faça um update no campo novo com a data original transformada. O exemplo abaixo segue o modelo informado no post anterior.
Verifique o manual do MySQL para o uso da função DATE_FORMAT
UPDATE minhatabela
SET minhanovacoluna = FORMAT_DATE(minhaantigacoluna, '%m/%d/%A');

Vamos supor que eu estivesse disposto a perder todas as informações e começar do zero, como eu teria que proceder? Pois não tenho muito dados armazenados, ppoderia entrar com uma tabela nova já alterada para não dar esse erro?
Sim. Pode entrar com uma tabela nova já com o campo correto e entrar manualmente com os ddos.

Também gostaria de fazer uma ressalva, que entrei no manual do SQL ele até relata sobre o erro que esta dando no meu caso, mais não me da a solução, diz apenas que pode ser algum valor não reconhecido pelo MySQL.

O erro está acontecendo porque o formato da data está errado. Já fiz este tipo de modificação e tive poucos problemas para converter dados. Siga as passo a passo instruções que passei no post anterior e você obterá sucesso.

Sei que você é novato. Não desista. Este tipo de dificuldade é muito bom para aumentar seus conhecimentos.

Link para o comentário
Compartilhar em outros sites

  • 0

Então nesse terceiro passo que errei, me diga aonde eu faço isso com mais precisão, pois não estou encontrando o local para adotar esse procedimento.

Fiz no SQL e me retornou o seguinte erro

Erro
Comando SQL:  

SELECT * 
FROM `mural` 
WHERE 1 
UPDATE mural SET dataprogressiva = FORMAT_DATE(

DATA ,
'%m/%d/%A'
) LIMIT 0 ,
30 

Mensagens do MySQL :  

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UPDATE mural
SET dataprogressiva = FORMAT_DATE(data, '%m/%d/%A')
LIMIT 0, 30' at line 2

Mais não sei bem ao certo se estou adotando esse procedimento no local correto.

Editado por Añd®é™
Link para o comentário
Compartilhar em outros sites

  • 0

'Anãod®é™'

Onde você escreveu a instrução que deu erro no post acima, escreva esta intrução:

UPDATE mural 
SET dataprogressiva = FORMAT_DATE(SUBSTRING(DATA, 27, 10) , '%d/%m/%A')

A função substring está sendo usada para evitar pegar o texto "A mensagem foi postada em " que aparece no campo DATA de sua tabela.

Dica: se você não precisa deste texto "A mensagem foi postada em " mude seu programa parq que ele não seja gravado.

Informe se conseguiu. Caso tenha erro informe o erro. Não se irrite. Este tipo de conversão é chato mesmo, mas é bom para seu aprendizado.

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,9k
×
×
  • Criar Novo...