Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Bom dia!
Preciso fazer um update em um campo do tipo int de uma tabela para corrigir o horário e a informação que estou buscando está em um campo do tipo datetime de outra tabela. Fiz um update da seguinte forma:
update zan_m00 set m00zc=(SELECT convert(varchar(11),dataemissao,114)
FROM tab_nota_header
where dataemissao between '2018-08-01 00:00:00' and '2018-08-01 23:59:59'
and numpdv=111
and codloja=1
and numnota=74841)
where m00af='2018-08-01'
and m00za=1
and m00ac=111
and m00ad=69614
Esse update retornou a seguinte mensagem:
Falha ao converter o varchar valor '11:56:57:00' para o tipo de dados int.
No lugar onde está varchar experimentei usar int, entretanto, ele faz o update somando todo o conteúdo do campo, também usei o CAST e o problema é o mesmo.
Se eu fizer somente o select, ele retorna pra mim somente a hora, que é o que preciso, mas aí tem outro problema, no campo tipo int a hora é tudo junto 115657 e nesse select ele retorna 11:56:57.
Existe alguma forma de fazer esse update da forma que preciso?update zan_m00 set m00zc=(SELECT CONVERT(INT, CAST(convert(varchar(21),dataemissao,113) as DATETIME))
FROM tab_nota_header
where dataemissao between '2018-08-01 00:00:00' and '2018-08-01 23:59:59'
and numpdv=111
and codloja=1
and numnota=74841)
where m00af='2018-08-01'
and m00za=1
and m00ac=111
and m00ad=69614
Testei o select e ele retornou a mensagem:
Mensagem 241, Nível 16, Estado 1, Linha 2
Falha ao converter data e/ou hora da cadeia de caracteres.
Vou dar uma olhada nesses tipos de conversões e ver se consigo alguma coisa. Obrigado pela colaboração.Colega, havia uma conversão incorreta o tamanho da String deve ser 20 e não 21 (destacado em vermelho).
Antes de fazer o update, utilize o select abaixo para te ajudar a validar o resultado
SELECT CONVERT(INT, CAST(convert(varchar(20),dataemissao,113) as DATETIME))
update zan_m00 set m00zc=(SELECT CONVERT(INT, CAST(convert(varchar(**20**),dataemissao,113) as DATETIME))
FROM tab_nota_header
where dataemissao between '2018-08-01 00:00:00' and '2018-08-01 23:59:59'
and numpdv=111
and codloja=1
and numnota=74841)
where m00af='2018-08-01'
and m00za=1
and m00ac=111
and m00ad=69614Bom dia!
WCN, fiz o select conforme você orientou e ele somou o campo. Testei vários tipos de conversões e não tem dado certo, talvez tenha que mudar a estrutura das tabelas, aí nesse caso eu já não tenho acesso.
De qualquer forma, obrigado por enquanto, vou tentar mais algumas opções, se não der certo vou ter que mudar o foco para outra forma.
Basta converter para inteiro a coluna detetime (irá perder os segundos).
O windows internamente armazenda data/hora como float.
select getdate() Real,cast(getdate() as int) Inteiro,cast(cast(getdate() as int) as datetime) SemSegundos
Colega, sugiro fazer duas transformações, utilizando CONVERT, uma de DATETIME para VARCHAR, pegando todas as informações e a segunda transformando VARCHAR para INT.
Abaixo segue a sugestão:
and m00za=1 and m00ac=111 and m00ad=69614maiores detalhes sobre os tipos de conversões possíveis pode ser visto em https://docs.microsoft.com/pt-br/sql/t-sql/functions/cast-and-convert-transact-sql?view=sql-server-2017
Detalhe: Isso é uma adaptação e certamente você irá precisar ajustar a aplicação para fazer o tratamento inverso, na hora de exibir o dado (transformar de INT para DATETIME ou VARCHAR).
A solução ideal seria você ajustar o modelo do banco.