Ir para conteúdo
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

 

Editado por Faabiianooc

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por isaque_cb2
      Boa noite, estou postando qui por que pesquisei e não achei nada que ajudasse... bem, criei um banco de dados para armazenar meus projetos e carrega-los dinamicamente com o php, deu certo, mas quando tem alguma acentuação no texto ele retorna "�"... 
      ~Grato desde Já~
    • Por GabrielB3r
      Bom dia,
      estou tentando criar um sistema de empréstimo e devolução de documentos.
      Funciona da seguinte forma:
      A pessoa tem o opção de cadastrar novos documentos,os quais são inseridos da tabela "dossie_cadastrado", e ela pode cadastrar o empréstimo e a devolução do mesmo que ficam salvos na tabela "dossie_emprestimo".
      A parte de cadastro e empréstimo consegui fazer funcionar, meu problema é na hora de cadastrar a devolução. Preciso inserir a data atual no último cadastro de um determinado dossie na tabela "dossie_emprestimo".
       
      Tenho o seguinte código:
      if(isset($_POST["cod_cad"])){         $cod_cad = $_POST["cod_cad"];         }          if(isset($_GET["cod_cad"])){         $cod_cad = $_GET["cod_cad"];     } $cod_cad = strip_tags($_POST['cod_cad']); $select_upd= mysqli_query($conexao_bd,"SELECT id_emp, data_emp from dossie_emprestimo where cod_cad='$cod_cad' ORDER BY data_emp desc limit 1") ; $sql_update="UPDATE dossie_emprestimo SET data_dev=CURDATE() WHERE id_emp='$id_emp'"; mysqli_query($conexao_bd, $sql_update);  
      quando eu rodo esse código separado no phpmyadmin, funciona normalmente, mas quando coloco no meu código ele não encontra o id_emp.
      id_emp - id de empréstimo, chave primaria com auto incremento.
      data_emp - data que foi realizado o empréstimo.
      cod_cad - código de cadastro, é o código que esta relacionado a tabela de cadastro, é o id do documento. ex: toda vez que o documento "20" for emprestado esse código sera "20".
       
    • Por Pedro Terencio
      votar contrafavorita   Bom dia galera, estou com uma duvida sobre manipulação de data. Preciso pegar um valor (dado pelo usuario) e transformar este valor em dia do mês.
       
      Exemplo : 
      $Valor_Usuario = 30;
      $Data = 12/10/2018;
      $Resultado = 30/10/2018;
       
      O que estou buscando fazer é, uma rotina de gastos, então o usuario me informa um dia fixo de gasto, (Todo dia 30 irei gastar R$50) e o sistema todo dia 30 irá subtrair R$50 da conta. O que me gera outra duvida...
       
      Depois da manipulação da data como fazer esse checking da data? (Se hoje é dia 30 ou não // Para saber quando subtrair os R$ 50)
    • Por teteuvec
      Prezados boa noite,
       
      Estou tentando atualizar dados no BD. Porém ao aplicar o update não gera erro e nem atualiza no DB.
      Segue abaixo o script. Já testei a conexão com o DB e funciona perfeitamente como function.
       
      <?php session_start(); if ($_SESSION['validate_login'] != true) { header("Location: /index.php"); } ini_set( "display_errors", true ); error_reporting( E_ALL ); require_once('../phpfunctions.php'); header('Content-Type: text/html; charset=utf-8'); switch ($_POST['action']) { case '0': $recordset = mysqli_query(connect(tupa), "SELECT * FROM people_records WHERE cpf_cnpj = {$_POST['cpf_cnpj']} ORDER BY id DESC") or die(mysqli_error(connect(tupa))); $_row = mysqli_num_rows($recordset); if ($_row == 0) { mysqli_query(connect(tupa), "UPDATE people_records SET name = {$_POST['name']}, cpf_cnpj = {$_POST['cpf_cnpj']}, cellphone = {$_POST['cellphone']}, telephone = {$_POST['telephone']} WHERE id = {$_POST['id']}") or die (mysqli_error(connect(tupa))); } else { echo "<script language='JavaScript'>alert('Este registro já existe.')</script>"; } mysqli_free_result($recordset); echo "<script language='JavaScript'>location.href='../system.php';</script>"; break;  
       
    • Por maal0n
      Bom dia pessoal, sou iniciante no php e estou com um problema, alguem consegue me ajudar...
       
      O codigo abaixo tem a função de mostrar todos os vencimentos da semana para pagamento de mensalidades... só que ele encontra o dia do sabado(ultimo dia da semana) e mostra os 6 dias anteriores a ele... o problema acontece quando o sabado cai no dia 1 ou 2 do mes seguinte... ai ele vai calcular dia 1 menos 6... e nao vai me gerar resultados nenhum... conseguiram entender? alguem consegue me ajudar nisso ?
       
      segue meu codigo..
       
       
       
      <?php $seleciona = mysql_query("SELECT anoselecionado FROM anoselecionado LIMIT 1"); while($ln = mysql_fetch_array($seleciona)){ $anoselecionado = $ln['anoselecionado']; } ?> <?php $dataatual = date('d/m/y'); $partes = explode("/", $dataatual); $diaatual = $partes[0]; $mesatual = $partes[1]; $anoatual = "20".$partes[2]; if ($mesatual == "1"){$essemes = 'jan';}; if ($mesatual == "2"){$essemes = 'fev';}; if ($mesatual == "3"){$essemes = 'mar';}; if ($mesatual == "4"){$essemes = 'abr';}; if ($mesatual == "5"){$essemes = 'mai';}; if ($mesatual == "6"){$essemes = 'jun';}; if ($mesatual == "7"){$essemes = 'jul';}; if ($mesatual == "8"){$essemes = 'ago';}; if ($mesatual == "9"){$essemes = 'setembro';}; if ($mesatual == "10"){$essemes = 'outubro';}; if ($mesatual == "11"){$essemes = 'nov';}; if ($mesatual == "12"){$essemes = 'dez';}; $sabado = 6; //sabado = 6º dia = fim da semana. $dia_atual=date('w'); //pego o dia atual $dias_que_faltam_para_o_sabado = $sabado - $dia_atual; $inicio = strtotime("-$dia_atual days"); $fim = strtotime("+$dias_que_faltam_para_o_sabado days"); $primdiasemana = date('d',$inicio); //data inicial $ultmodiasemana = date('d',$fim); //data final $seleciona = mysql_query("SELECT * FROM mensalidades WHERE (data_pagamento BETWEEN '".$primdiasemana."' and '".$ultmodiasemana."') and ano = ".$anoselecionado." and $essemes = 0 ORDER by id DESC"); $conta = mysql_num_rows($seleciona); if($conta <= 0){ echo "<center><div><h3>Não existem mensalidades pendentes com vencimento esta semana</h3></div></center>"; }else{ echo " <table class='table table-bordered' id='tabela-mensalidades'> <thead> <tr style='backgroud-color: #2D335B'> <th style='width: 200px'>Aluno</th> <th>Vencimento</th> <th>Status</th> <th>Serviço</th> <th>Valor</th> </tr> </thead> "; while($ln = mysql_fetch_array($seleciona)){ $id = $ln['id']; $clientes_id = $ln['clientes_id']; $servico_id = $ln['servico_id']; ?>  
×

Informação importante

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