Usuário com melhor resposta
The conversion of a char data type to a datetime...

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
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]
- Editado Junior Galvão - MVPMVP quarta-feira, 7 de junho de 2017 17:07
- Marcado como Resposta Guilherme Macedo S segunda-feira, 19 de junho de 2017 14:11
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.
-
-
-
-
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]
- Editado Junior Galvão - MVPMVP quarta-feira, 7 de junho de 2017 17:07
- Marcado como Resposta Guilherme Macedo S segunda-feira, 19 de junho de 2017 14:11
-
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.