none
Problemas para converter data em SELECT...? RRS feed

  • Pergunta

  •  Sei que esta dúvida é bastante comum, mas pesquisei bastante e não consegui resolver meu problema, é um simples SELECT  ao MySql

     public class Funcionario

    public DateTime datanasc { get; set; }

    ...depois disso vem o código de prache, etc, e por fim:

     funcionario.datanasc = Convert.ToDateTime(ler["datanasc"]);

    ...e nesssa última linha vem os erros, sei que desta forma não está certo, mas tentei outras e também não dá.

    Obrigado a todos.

    quarta-feira, 30 de outubro de 2013 17:11

Respostas

  • funcionário.datanasc = Convert.ToDateTime(ler["datanasc"].ToString());

    Testa assim.
    ou

    ler.GetDateTime(ler.GetOrdinal("datanasc"))

    • Editado Daniel Brito br quarta-feira, 30 de outubro de 2013 17:21 Dados
    • Marcado como Resposta Tiago Vinícios quinta-feira, 31 de outubro de 2013 07:24
    quarta-feira, 30 de outubro de 2013 17:17
  • deu o seguinte erro nesta linha:

    "Dados são Null. Não é possível chamar este método ou esta propriedade em valores Null."

    ...mas todos os campos data estão preenchidos no banco

    • Marcado como Resposta Tiago Vinícios quinta-feira, 31 de outubro de 2013 07:24
    quarta-feira, 30 de outubro de 2013 17:48
  • Se vier nulo vai dar erro mesmo coloque um breakpoint e veja a sua query montada e teste diretamente no mysql, depois no momento que seu reader for atribuir o valor veja o que há com WatchWindow, você verá onde esta o erro que provavelmente é na select já que seu banco esta preenchido ou erro de nome coluna.
    • Marcado como Resposta Tiago Vinícios quinta-feira, 31 de outubro de 2013 07:24
    quarta-feira, 30 de outubro de 2013 17:54
  • Pare retirar as horas :
    Convert.ToDateTime(suaveriavel).ToShortDateString();
    
    //se já for datetime tipo
    data.ToShortDateString();
    
    
    Vem no formato brasileiro pq vc esta utilizando padrão brasileiro no seu projeto ou seja a culture pt-br se quiser passar para o americano altere a culture para em-Us
    • Marcado como Resposta Tiago Vinícios quinta-feira, 31 de outubro de 2013 07:24
    quarta-feira, 30 de outubro de 2013 18:01
  • Se vc estiver usando ado seu select pode ficar assim :

    select isnull(convert(varchar(10),data,103),'0') as data

    o isnull verifica se a data for nula trará 0 que é a data 01-01-1900 e se tiver uma data ele converte para dd/mm/aaaa


    Junior

    • Marcado como Resposta Tiago Vinícios quinta-feira, 31 de outubro de 2013 07:24
    quarta-feira, 30 de outubro de 2013 18:02
  • Não tinha resolvido ?
    • Marcado como Resposta Tiago Vinícios quinta-feira, 31 de outubro de 2013 07:24
    quarta-feira, 30 de outubro de 2013 18:18
  • Assim :

    ler.GetDateTime(ler.GetOrdinal("suacoluna")).ToShortDateString();
    Se foi útil marque...
    • Marcado como Resposta Tiago Vinícios quinta-feira, 31 de outubro de 2013 07:24
    quarta-feira, 30 de outubro de 2013 18:29
  • Eu não tenho o MySql aqui pra testar mas faz na variável então, pra não alterar o seu select.
    • Marcado como Resposta Tiago Vinícios quinta-feira, 31 de outubro de 2013 07:24
    quarta-feira, 30 de outubro de 2013 18:49
  • A resposta do Junior_luiz é para Sql Server.

    Tenta isso:
    if(ler["datanasc"] != DBNull.Value)
        funcionário.datanasc = DateTime.ParseExact(ler["datanasc"].ToString(), "dd/MM/yyyy", null);

    caso não dê, mude "dd/MM/yyyy" para "MM/dd/yyyy"
    • Marcado como Resposta Tiago Vinícios quinta-feira, 31 de outubro de 2013 07:25
    quarta-feira, 30 de outubro de 2013 18:54
  • isnull(convert(varchar(10),datnasc,103),'0') AS datanasc

    tenta assim


    Junior

    • Marcado como Resposta Tiago Vinícios quinta-feira, 31 de outubro de 2013 07:25
    quarta-feira, 30 de outubro de 2013 19:05
  • O banco de dados é MySql, não vai funcionar. O isnull no MySQL é ifnull e a conversão também é diferente.

    • Marcado como Resposta Tiago Vinícios quinta-feira, 31 de outubro de 2013 07:25
    quarta-feira, 30 de outubro de 2013 19:14

Todas as Respostas

  • funcionário.datanasc = Convert.ToDateTime(ler["datanasc"].ToString());

    Testa assim.
    ou

    ler.GetDateTime(ler.GetOrdinal("datanasc"))

    • Editado Daniel Brito br quarta-feira, 30 de outubro de 2013 17:21 Dados
    • Marcado como Resposta Tiago Vinícios quinta-feira, 31 de outubro de 2013 07:24
    quarta-feira, 30 de outubro de 2013 17:17
  • deu o seguinte erro nesta linha:

    "Dados são Null. Não é possível chamar este método ou esta propriedade em valores Null."

    ...mas todos os campos data estão preenchidos no banco

    • Marcado como Resposta Tiago Vinícios quinta-feira, 31 de outubro de 2013 07:24
    quarta-feira, 30 de outubro de 2013 17:48
  • Se vier nulo vai dar erro mesmo coloque um breakpoint e veja a sua query montada e teste diretamente no mysql, depois no momento que seu reader for atribuir o valor veja o que há com WatchWindow, você verá onde esta o erro que provavelmente é na select já que seu banco esta preenchido ou erro de nome coluna.
    • Marcado como Resposta Tiago Vinícios quinta-feira, 31 de outubro de 2013 07:24
    quarta-feira, 30 de outubro de 2013 17:54
  • Agora funcionou, é que nas propriedades do gridview, eu não estava mostrando a coluna data, daí o erro, obrigado, ajudou muito, outra dúvida, notei que é preciso inserir no mysql datas no formato americano, mas num select vem no formato brasileiro, é normal isso? E como tiro as horas, para mostrar só a data?
    quarta-feira, 30 de outubro de 2013 17:54
  • Pare retirar as horas :
    Convert.ToDateTime(suaveriavel).ToShortDateString();
    
    //se já for datetime tipo
    data.ToShortDateString();
    
    
    Vem no formato brasileiro pq vc esta utilizando padrão brasileiro no seu projeto ou seja a culture pt-br se quiser passar para o americano altere a culture para em-Us
    • Marcado como Resposta Tiago Vinícios quinta-feira, 31 de outubro de 2013 07:24
    quarta-feira, 30 de outubro de 2013 18:01
  • Se vc estiver usando ado seu select pode ficar assim :

    select isnull(convert(varchar(10),data,103),'0') as data

    o isnull verifica se a data for nula trará 0 que é a data 01-01-1900 e se tiver uma data ele converte para dd/mm/aaaa


    Junior

    • Marcado como Resposta Tiago Vinícios quinta-feira, 31 de outubro de 2013 07:24
    quarta-feira, 30 de outubro de 2013 18:02
  • está dando erro de sintáxe:

    "select id, nome, idade, cidade, uf, isnull(convert(varchar(10),datanasc,103),'0') as datanasc from funcionarios";

    quarta-feira, 30 de outubro de 2013 18:12
  • Não tinha resolvido ?
    • Marcado como Resposta Tiago Vinícios quinta-feira, 31 de outubro de 2013 07:24
    quarta-feira, 30 de outubro de 2013 18:18
  • não, deu erro de sintaxe no sql quando tentei a resposta do Junior_luiz.

    assim está danto certo:

    funcionario.datanasc= ler.GetDateTime(ler.GetOrdinal("datanasc"));

    ...mas não consegui tirar as horas

    quarta-feira, 30 de outubro de 2013 18:20
  • Assim :

    ler.GetDateTime(ler.GetOrdinal("suacoluna")).ToShortDateString();
    Se foi útil marque...
    • Marcado como Resposta Tiago Vinícios quinta-feira, 31 de outubro de 2013 07:24
    quarta-feira, 30 de outubro de 2013 18:29
  • já tinha tentado, dá erro de conversão
    quarta-feira, 30 de outubro de 2013 18:35
  • Eu não tenho o MySql aqui pra testar mas faz na variável então, pra não alterar o seu select.
    • Marcado como Resposta Tiago Vinícios quinta-feira, 31 de outubro de 2013 07:24
    quarta-feira, 30 de outubro de 2013 18:49
  • A resposta do Junior_luiz é para Sql Server.

    Tenta isso:
    if(ler["datanasc"] != DBNull.Value)
        funcionário.datanasc = DateTime.ParseExact(ler["datanasc"].ToString(), "dd/MM/yyyy", null);

    caso não dê, mude "dd/MM/yyyy" para "MM/dd/yyyy"
    • Marcado como Resposta Tiago Vinícios quinta-feira, 31 de outubro de 2013 07:25
    quarta-feira, 30 de outubro de 2013 18:54
  • isnull(convert(varchar(10),datnasc,103),'0') AS datanasc

    tenta assim


    Junior

    • Marcado como Resposta Tiago Vinícios quinta-feira, 31 de outubro de 2013 07:25
    quarta-feira, 30 de outubro de 2013 19:05
  • O banco de dados é MySql, não vai funcionar. O isnull no MySQL é ifnull e a conversão também é diferente.

    • Marcado como Resposta Tiago Vinícios quinta-feira, 31 de outubro de 2013 07:25
    quarta-feira, 30 de outubro de 2013 19:14
  • não tirei ainda as horas, mas com uma pesquisa eu consigo, obrigado a todos
    quinta-feira, 31 de outubro de 2013 07:25
  • Resolvi, apenas na propriedade dataFormatString do gridview coloca assim: 

    {0:dd/MM/yyyy}

    ...e pronto, mas parece que não é uma boa prática, pois irá converter data em string, alguém sabe dizer?

    quinta-feira, 31 de outubro de 2013 19:09