Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Rodymb

Update no campo tipo int buscando do campo tipo datetime

Recommended Posts

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?

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

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:


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


maiores 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.

Compartilhar este post


Link para o post
Compartilhar em outros sites
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.

Compartilhar este post


Link para o post
Compartilhar em outros sites
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=69614

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom 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.

 

image.png.671e6f05f03f7849df47e094b152f022.png

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por ILR master
      Fala galera, tudo bem?
       
      Tenho o seguinte codigo:
       
       class Data {
      public static function ExibirTempoDecorrido($date)
      {
          if(empty($date))
          {
              return "Informe a data";
          }
          $periodos = array("segundo", "minuto", "hora", "dia", "semana", "mês", "ano", "década");
          $duracao = array("60","60","24","7","4.35","12","10");
          $agora = time();
          $unix_data = strtotime($date);
          // check validity of date
          if(empty($unix_data))
          {  
              return "Bad date";
          }
          // is it future date or past date
          if($agora > $unix_data) 
          {  
              $diferenca     = $agora - $unix_data;
              $tempo         = "atrás";
          } 
          else 
          {
              $diferenca     = $unix_data - $agora;
              $tempo         = "agora";
          }
          for($j = 0; $diferenca >= $duracao[$j] && $j < count($duracao)-1; $j++) 
          {
              $diferenca /= $duracao[$j];
          }
          $diferenca = round($diferenca);
          if($diferenca != 1) 
          {
              $periodos[$j].= "s";
          }
          return "$diferenca $periodos[$j] {$tempo}";
      }
      }
       
      Funciona redondinho se o valor retornado for de algumas horas, mas...
      Quando passa de dois meses, ele retorna a palavra mess. Deve ser por conta dessa linha
      if($diferenca != 1) 
          {
              $periodos[$j].= "s";
          }
       
      Quero que modre:
       
      2 meses atrás
      e não
      2 mess atrás.
       
      Espero que tenham entendido.
       
      Valeu
    • Por vicente386
      Ola. Tenho uma tabela no 3 campos que sao "LIVRO, POS, PAGINA" ao qual a logica e a seguinte: cada livro tem 100 paginas cada pagina tem 30 posiçoes tenho 8,364 registros pra inserir chegando a 100 paginas com 30 posiçoes cada passa para o livro 2 e como fazer o update na tabela inserindo nos campos LIVRO = 1, POS de 0 a 30 e PAGINA 1 para cada 30 registros logos apos pagina 2 ?
      estou tentando fazer assim:
      <?php > ini_set('max_execution_time', 2000); $pdo = new > DO(DB_SERVER.":host=".DB_HOST.";dbname=".DB_BASE,DB_USER,DB_PASSWORD); > $sql = $pdo->prepare("SELECT count(*) FROM tabela2018"); > $sql->execute(); > $livro = 1; > foreach($sql as $obj){ > $variavel = $obj[0]; > ceil((float)$variavel/100); > $qtdlaco = ceil((float)$variavel/100); > for ($id = 1; $id <= 35; $id++) { > for($L=1; $L < $qtdlaco; $L++) { > for ($P = 0; $P <= 30; $P++) { > $sql = $pdo->prepare("UPDATE tabela2018 SET LIVRO = :LIVRO, POS = :POS, PAGINA = :PAGINA WHERE idtabela2018 = $id"); > $sql->bindValue(':LIVRO', $livro); > $sql->bindValue(':POS', $P); > $sql->bindValue(':PAGINA', $L); > $sql->execute(); > } > } > } >} ?> mas na tebela so aparece: LIVRO POS PAGINA 1 30 83 1 30 83 1 30 83 e nao como deveria : LIVRO POS PAGINA 1 0 1 1 1 1 1 2 1
    • Por ericklluz
      Boa tarde senhores, sou iniciante no Js e estou com uma dúvida, estou tentando resolver uma questão num CRM onde temos um campo de data, isto é, um input com uma data específica e eu gostaria de criar um script que recebe este input e retorna o primeiro dia deste mês e coloca em outro campo.
       
      Alguém poderia me dar uma ajuda pra que entenda como construír este pequeno script. serei eternamente grato.
       
      Obrigado comunidade!
    • Por Kefatif
      Prezados, boa tarde.
       
      Preciso criar um select que me traga do banco os registros que se repetem vazios nos últimos 3 meses nos campos:
      campo_a
      campo_b
       
      vazios (null).
       
      Podem me ajudar?
    • Por Roberto S. Santos
      Boa noite devs.
      Poderiam me ajudar ?
      Estou querendo fazer o seguinte em um formulário PHP...
      O usuário deve cadastrar a sua data e horário do uso na churrasqueira e quando chegar nesta data e no horário final ele apaga os dados do cadastro desta reserva.
      Como posso fazer isto com PHP ?
      Temos...
      data reserva
      hora reserva  (hora inicial)
      hora final (já vai estar pré definida na base de dados)
      Banco de Dados : clientes
      Tabela : reserva
      Deus abençoe a todos.
       
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.