none
The conversion of a char data type to a datetime... RRS feed

  • Pergunta

  • Boa tarde,

    Tudo funcionava perfeitamente utilizando o SQL Server 2008 local, usando colunas com tipo "date" e passando os dados como strings ('06/06/2017'). Ao passar a utilizar no SQL Server 2008 R2, de cara me obrigou a trocar todas as colunas criadas como "date" para "datetime" e com isso recebo o seguinte erro ao fazer update ou insert:

    The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.

    Aproveito para dizer que para iserir datas vazias eu utilizava NULL na string SQL sem os plics ('). Minha rotina de update por exemplo está assim:

    public void EditFunc(int func_cod, string func_filial, string func_nome, string func_tel1, string func_tel2, string func_tel3, string func_email1, string func_email2, string func_end, string func_num, string func_compl, string func_bairro, string func_cep, string func_cidade, string func_uf, string func_nasc, string func_admissao, string func_cpf, string func_rg, string func_cnh, string func_clt, string func_pis, string func_tit, string func_plsaude, string func_crea, string func_estadocivil, string func_escolaridade, string func_cargo, string func_aso, string func_aso2, string func_cbsp, string func_nr10, string func_obs1, string func_obs2, string func_f5por, string func_f5em, string func_nomeTrab, string func_usuario, string func_senha, string func_grupo, string func_demissao, string func_heut, int func_validade)
            {
                if (func_nasc == "  /  /") func_nasc = "'NULL'";
                    else func_nasc = "'" + func_nasc + "'";
                if (func_aso == "  /  /") func_aso = "'NULL'";
                    else func_aso = "'" + func_aso + "'";
                if (func_cbsp == "  /  /") func_cbsp = "'NULL'";
                    else func_cbsp = "'" + func_cbsp + "'";
                if (func_nr10 == "  /  /") func_nr10 = "'NULL'";
                    else func_nr10 = "'" + func_nr10 + "'";
                if (func_admissao == "  /  /") func_admissao = "'NULL'";
                    else func_admissao = "'" + func_admissao + "'";
                if (func_demissao == "  /  /") func_demissao = "'NULL'";
                    else func_demissao = "'" + func_demissao + "'";
                if (func_heut == "  /  /") func_heut = "'NULL'";
                else func_heut = "'" + func_heut + "'";
                
                SqlCommand comando = new SqlCommand("UPDATE FUNCIONARIOS SET func_filial = '" + func_filial +
                                                    "', func_nome = '" + func_nome +
                                                    "', func_tel1 = '" + func_tel1 +
                                                    "', func_tel2 = '" + func_tel2 +
                                                    "', func_tel3 = '" + func_tel3 +
                                                    "', func_email1 = '" + func_email1 +
                                                    "', func_email2 = '" + func_email2 +
                                                    "', func_end = '" + func_end +
                                                    "', func_num = '" + func_num +
                                                    "', func_compl = '" + func_compl +
                                                    "', func_bairro = '" + func_bairro +
                                                    "', func_cep = '" + func_cep +
                                                    "', func_cidade = '" + func_cidade +
                                                    "', func_uf = '" + func_uf +
                                                    "', func_nasc = " + func_nasc +
                                                    ", func_admissao = " + func_admissao +
                                                    ", func_cpf = '" + func_cpf +
                                                    "', func_rg = '" + func_rg +
                                                    "', func_cnh = '" + func_cnh +
                                                    "', func_clt = '" + func_clt +
                                                    "', func_pis = '" + func_pis +
                                                    "', func_tit = '" + func_tit +
                                                    "', func_plsaude = '" + func_plsaude +
                                                    "', func_crea = '" + func_crea +
                                                    "', func_estadocivil = '" + func_estadocivil +
                                                    "', func_escolaridade = '" + func_escolaridade +
                                                    "', func_cargo = '" + func_cargo +
                                                    "', func_aso = " + func_aso +
                                                    ", func_aso2 = '" + func_aso2 +
                                                    "', func_cbsp = " + func_cbsp +
                                                    ", func_nr10 = " + func_nr10 +
                                                    ", func_obs1 = '" + func_obs1 +
                                                    "', func_obs2 = '" + func_obs2 +
                                                    "', func_f5por = '" + func_f5por +
                                                    "', func_f5em = '" + func_f5em +
                                                    "', func_nomeTrab = '" + func_nomeTrab +
                                                    "', func_usuario = '" + func_usuario +
                                                    "', func_senha = '" + func_senha +
                                                    "', func_grupo = '" + func_grupo +
                                                    "', func_demissao = " + func_demissao +
                                                    ", func_heut = " + func_heut +
                                                    ", func_validade = " + func_validade +
                                                    " WHERE func_cod = " + func_cod + "", con);
                con.Open();
                try
                {
                    comando.ExecuteNonQuery();
                }
                finally
                {
                    con.Close();
                }
            }

    Alguém conseguiria me ajudar?

    Obrigado

    Pestana

    terça-feira, 6 de junho de 2017 15:45

Respostas

  • Roberto,

    Concordo com o José Diz, além disso, se você estiver utilizando o SQL Server 2012 ou superior poderá utilizar a função FORMAT para escolher e definir o formato de apresentação dos seus dados, veja os exemplos abaixo:

    DECLARE @d DATETIME = '10/01/2011';
    SELECT FORMAT ( @d, 'd', 'en-US' ) AS 'US English Result'
          ,FORMAT ( @d, 'd', 'en-gb' ) AS 'Great Britain English Result'
          ,FORMAT ( @d, 'd', 'de-de' ) AS 'German Result'
          ,FORMAT ( @d, 'd', 'zh-cn' ) AS 'Simplified Chinese (PRC) Result'; 
      
    SELECT FORMAT ( @d, 'D', 'en-US' ) AS 'US English Result'
          ,FORMAT ( @d, 'D', 'en-gb' ) AS 'Great Britain English Result'
          ,FORMAT ( @d, 'D', 'de-de' ) AS 'German Result'
          ,FORMAT ( @d, 'D', 'zh-cn' ) AS 'Chinese (Simplified PRC) Result'; 

    Como também a função CONCAT() que permite realizar a concatenação de tipos de dados diferentes para um formato direto string, veja os exemplos abaixo:

    SELECT CONCAT ( 'Happy ', 'Birthday ', 11, '/', '25' ) AS Result;  
    
    CREATE TABLE #temp (  
        emp_name nvarchar(200) NOT NULL,  
        emp_middlename nvarchar(200) NULL,  
        emp_lastname nvarchar(200) NOT NULL  
    );  
    INSERT INTO #temp VALUES( 'Name', NULL, 'Lastname' );  
    SELECT CONCAT( emp_name, emp_middlename, emp_lastname ) AS Result  
    FROM #temp; 


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]


    quarta-feira, 7 de junho de 2017 17:06

Todas as Respostas

  • Você se certificou de que todas as datas são datas válidas? Exemplo '30/02/1995' é aceitável como uma string, mas como datetime não, porque essa data não existe, fevereiro só vai até dia 29... Um exemplo, pode acontecer com outras datas. Quando vi esse erro uma vez, era porque tinham datas que não existiam. 
    terça-feira, 6 de junho de 2017 16:34
  • Sim, todas as datas são válidas. Será que eu consigo enviar a string NULL para inserir como vazio para datetime no 2008 R2? Pois no 2008 funciona perfeitamente para date.
    terça-feira, 6 de junho de 2017 16:54
  • Não sei ao certo, você já testou isso? Mas eu acho que por ser datetime só aceita datas. 
    terça-feira, 6 de junho de 2017 17:01
  • Acabo de verificar que isso está acontecendo por eu inserir 'dd/MM/yyyy'. Se eu fizer 'MM/dd/yyyy' funciona.

    Algum comando ou ajuste que eu possa fazer para não ter que tratar todas as entradas?

    terça-feira, 6 de junho de 2017 17:21
  • Deleted
    • Sugerido como Resposta Roberto AB Filho terça-feira, 6 de junho de 2017 20:42
    terça-feira, 6 de junho de 2017 17:35
  • Roberto,

    Concordo com o José Diz, além disso, se você estiver utilizando o SQL Server 2012 ou superior poderá utilizar a função FORMAT para escolher e definir o formato de apresentação dos seus dados, veja os exemplos abaixo:

    DECLARE @d DATETIME = '10/01/2011';
    SELECT FORMAT ( @d, 'd', 'en-US' ) AS 'US English Result'
          ,FORMAT ( @d, 'd', 'en-gb' ) AS 'Great Britain English Result'
          ,FORMAT ( @d, 'd', 'de-de' ) AS 'German Result'
          ,FORMAT ( @d, 'd', 'zh-cn' ) AS 'Simplified Chinese (PRC) Result'; 
      
    SELECT FORMAT ( @d, 'D', 'en-US' ) AS 'US English Result'
          ,FORMAT ( @d, 'D', 'en-gb' ) AS 'Great Britain English Result'
          ,FORMAT ( @d, 'D', 'de-de' ) AS 'German Result'
          ,FORMAT ( @d, 'D', 'zh-cn' ) AS 'Chinese (Simplified PRC) Result'; 

    Como também a função CONCAT() que permite realizar a concatenação de tipos de dados diferentes para um formato direto string, veja os exemplos abaixo:

    SELECT CONCAT ( 'Happy ', 'Birthday ', 11, '/', '25' ) AS Result;  
    
    CREATE TABLE #temp (  
        emp_name nvarchar(200) NOT NULL,  
        emp_middlename nvarchar(200) NULL,  
        emp_lastname nvarchar(200) NOT NULL  
    );  
    INSERT INTO #temp VALUES( 'Name', NULL, 'Lastname' );  
    SELECT CONCAT( emp_name, emp_middlename, emp_lastname ) AS Result  
    FROM #temp; 


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]


    quarta-feira, 7 de junho de 2017 17:06
  • Bom dia

    Por falta de retorno esta thread esta encerrada !

    Por gentileza, caso necessário abra uma nova thread.

    Atenciosamente,


    Guilherme Macedo S

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    TechNet Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    segunda-feira, 19 de junho de 2017 14:11