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 clovis.sardinha
      Boa noite.
      Tenho um bd com 2 tabelas. A primeira (serv_os) tem as colunas id, fk_os e fk_servico  a segunda (prod_os) tem as colunas id, fk_os e agora eu criei a coluna fk_serv. A coluna fk_serv vai ser preenchida com o valor id da primeira coluna. Fiz o seguinte update entre as tabelas: 
      UPDATE prod_os
      JOIN serv_os ON serv_os.fk_os= prod_os.fk_os
      SET prod_os.fk_serv = serv_os.id
      WHERE prod_os.fk_os=serv_os.fk_os;
       
      Até aqui tudo bem, porém, fiquei com o seguinte problema.  Muitas vezes  existem vários serviços na primeira tabela, por exemplo id=100 produto A, id=101 produto B, porém o fk_os é o mesmo . Ai na coluna fk_serv aparece sempre o id do produto A. Nesse caso duas vezes. O produto B, C,...etc não aparece. 
      Não consegui nenhum comando, já que o join é pela coluna fk_os, que fizesse o update mudar o ponteiro para o serviço B,C,etc.
      Se alguém puder me ajudar eu agradeço.
    • Por ILR master
      Fala pessoal.
      Tudo bem?
       
      Tenho o seguinte código que funcionda perfeitamente:
       
      date_default_timezone_set("America/Sao_Paulo");
      $d_inicio= date('Y-m-d');
      $d_final= date('Y-m-d', strtotime('+30  day'));
       
      Mas eu quero definir a quantidade de dias pegando o valor que a variável:
       
      date_default_timezone_set("America/Sao_Paulo");
      $tempo = 30;
      $d_inicio= date('Y-m-d');
      $d_final= date('Y-m-d', strtotime('+$tempo  day'));
       
      Mas quando declaro com variável não funciona.
      Obrigado pela ajuda.
    • 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!
×

Informação importante

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