Ir para conteúdo
Fórum Script Brasil
  • 0

Cálculo De Valores


BrenoLourenço

Pergunta

Salve galera!

Estou tendo um probleminha cruel... vê se alguém pode me ajudar nessa!

Estou querendo realizar cálculo em cima do dia corrente do ano ($dia = gmdate("z"); ). É o seguinte, vamos partir do princípio que você pegue comigo um material no dia 6 de janeiro e me devolva dia 10 de janeiro, quando eu fizer o cálculo, irá me retornar que você ficou 4 dias com o material. Até aí tudo bem. Se você pegar em fevereiro e devolver em agosto, sem problemas também.

Meu problema todo está quando o ano vira, por exemplo, caso você pegue em novembro de 2004 e devolva em janeiro de 2005, tudo bem, fiz uma função que calculou essa diferença, o problema todo é, se você pegar em agosto de 2004 e devolver em novembro de 2005, aí não estou vendo solução para isso, ou seja, pegar em um mês de um ano, e devolver em um mês maior do ano seguinte.

Pensei em uma maneira, que seria de concatenar o ano + mês + dia corrente, mas tem um problema aí. Por exemplo:

Janeiro 2005 tem que ser maior do que Agosto de 2004 para realizar a subtração, porém fazendo da maneira que falei, não é bem assim.

Jan/05 -> 2005+01+31

Ago/04 -> 2004+08+220

Mas para isso funcionar, duas coisas teriam que ser corrigidas:

1) ao pegar mês de janeiro, ao invés de 31, teria que ser 031, tem como?

2) tem como no resultado de uma subtração, pegar somente os três últimos números? Tipo, como se tivesse um resultado assim: 200101030, porém queria apenas o 030.

Pô, quem souber como resolver esses meus probleminhas ou então souber de uma maneira mais fácil, muito grato por isso!

Segue a função do cálculo:

    function calcula_emprestimo($diacorr_emp,$diacorr_atual)

    {

        if($diacorr_emp <= $diacorr_atual)

        {

          $conta1 = $diacorr_atual - $diacorr_emp;

          return($conta1);

        }

        else

        {

          $aux = 365 - $diacorr_emp;

          $conta2 = $aux + $diacorr_atual;

          return($conta2);

        }

    }

Abraço!

Link para o comentário
Compartilhar em outros sites

18 respostass a esta questão

Posts Recomendados

  • 0

ae fera, tah ai o codigo prontinho p/ vc

<?

// AQUI VAI A DATA DE RETIRADA... CASO SEJA VARIAVEL APENAS TROQUE A DATA PELA VARIAVEL

$data_ret = explode("/", "20/08/2004");

$data_retirada = mktime(0,0,0, $data_ret[1], $data_ret[0], $data_ret[2]);

//AQUI É A DATA ATUAL

$data_ret = explode("/", date("d/m/Y"));

$data_entrega = mktime(0,0,0, $data_ret[1], $data_ret[0], $data_ret[2]);

//AQUI ELE APRESENTA EM DIAS O TEMPO QUE FICOU FORA

$tempo_permanencia = ($data_entrega - $data_retirada);

echo date("d", $tempo_permanencia);

?>

Link para o comentário
Compartilhar em outros sites

  • 0

Pô Luiz, valeu aí pela ajuda.

Mas deu um erro, e ali você está tratando pela data, eu estava tratando pelo dia corrente do ano. Tudo bem, poderia mudar meu script, mas você está fazendo o cálculo pelo mês, e o problema é quando muda o ano, aí continua no mesmo problema que eu estava, entendeste?

Então continuo com meu problema, caso alguém saiba como me ajudar, agradeço desde já!

Valeu!

Link para o comentário
Compartilhar em outros sites

  • 0

É, tá certo, consegui tirar o erro que estava dando.

Mas está caindo no mesmo problema que o meu Luiz.

Tipo, está funcionando corretamente, como voce disse:

"se a primeira for 10/10/2004 e a segunda 10/10/2005 ele vai retornar 365 dias"

Até aí tudo bem, mas se:

"se a primeira for 10/10/2004 e a segunda 15/10/2005 ele vai retornar 05 dias ao invés de 365 + 5"

entendeu? continuou com meu mesmo problema.

Link para o comentário
Compartilhar em outros sites

  • 0

Valeu Luiz!

Vê se consegue essa pra mim, porque do que já bati com a cabeça tentando resolver isso e não consegui... não tá no gibi!

PS: estou saindo do trabalho agora, e só vou poder visualizar dinovo esse post amanhã, mas gostaria de agradecer desde já pela atenção e pela ajuda aí! amanhã eu vejo se você ou alguma outra pessoa conseguiu matar essa pane pra mim!

Valeu aê pela ajuda!

Abração!

Link para o comentário
Compartilhar em outros sites

  • 0

Ve se isso ajuda:

esse script foi o Illidan que fez wink.gif

<?

function dif_data( $data1, $data2 )

{

if ( strcmp( substr( $data1, 2, 1 ), "/" ) == 0 )

{

     $data1 = substr($data1,6,4).substr($data1,2,4).substr($data1,0,2);

     $data2 = substr($data2,6,4).substr($data2,2,4).substr($data2,0,2);

}

$DataInicial = getdate(strtotime($data1));

$DataFinal = getdate(strtotime($data2));

$Dif = ($DataFinal[0] - $DataInicial[0]) / 86400;

return( $Dif );

}

$data1 = "10/10/2004";

$data2 = "15/10/2005";

$diferenca = dif_data($data1, $data2);

$diferenca = ceil($diferenca);

echo "$diferenca dia(s)";

?>

Link para o comentário
Compartilhar em outros sites

  • 0

Pô fabyo, valeu aí pelo script que você me indicou! Ele faz exatamente o que eu preciso, só que ele me gerou um erro, não sei se tem como corrigir.

É o seguinte, essas datas, $data1 e $data2 eu estou fazendo da seguinte forma:

$data1 - busco da base de dados

$data2 - pego localmente

Sendo que, quando estou gravando a data na base de dados, estou gravando separadamente, (dia, mes e ano). E quando ele grava o mês, por exemplo agosto, ao invés dele gravar zero oito (08), ele grava apenas o 8. Então quando eu faço a busca, concateno a data e jogo na variável $data1, a função me gera um erro por causa desse zero que está faltando.

$data1 = 27/8/2004 ele gera erro, porque teria que ter o zero.

E agora, o que eu faço? tem como adicionar esse zero no banco de dados ou teria que alterar meu banco de dados para gravar a data completa? (isso vai me dar uma trabalheira do cão, só faria isso em último caso!!!)

Ou teria alguma outra solução? alterar o banco de dados... putz... essa não, espero que tenha como verificar se o mês tem apenas 1 dígito e acrescentar o zero antes... sei lá...

Estou aberto a sugestões...

Desde já obrigado pelas colaborações!

Abraço

Link para o comentário
Compartilhar em outros sites

  • 0

cara o melhor é você alterar sua base de dados para formato DATE...

Tipo, senão você sempre que for trabalhar com data vai ter que ficar "improvisando", concatenando.. sempre vai se locura, porque com isso o codigo fica zoneado, fica mais lerdo, porque existem funções para datas e você não vai poder usar....

O melhor é alterar tudo....

cria ai uma nova coluna, e faiz uma funçao que ele concatena a data e grava na nova coluna.. em 5 min. você já modifica tudo

Link para o comentário
Compartilhar em outros sites

  • 0

Poxa, se perdesse apenas 5 minutos já o teria feito, mas o problema não está na base de dados, e sim nos arquivos já feitos. Estou montando um programa, e estou em fase terminal, e agora alterar todos os arquivos só por causa disso... putz, ninguém merece! Cadastro é apenas um, o problema são as consultas que são bastante e estão todas configuradas dessa maneira.

PS: fiz separado assim, porque quando montei tudo, ainda não tinha muita noção das coisas, hoje vejo que não é a melhor maneira... meu problema todo era dividir a data, separar... mas agora sei que não é tão complicado assim.

Mas tem problema não, hoje é sexta e só vou pegar nesse trabalho dinovo na segunda feira, então até lá eu vejo se recebo mais alguma outra mensagem de ajuda, senão vou tomando coragem para na segunda feira alterar tudo!

Só mais uma pergunta: se colocar na base de dados do tipo DATE, ele quando recebe mês agosto por exemplo, ele insere o zero né? Melhor, eu mesmo vou fazer o teste aqui...

Valeu aí aos que me ajudaram!

Abraço!

Link para o comentário
Compartilhar em outros sites

  • 0

Cara você falou de busca então mais um motivo pra usar o campo date

ele é o mais indicado pra isso e pra você fazer busca etc... tem funções proprias pra datas no mysql

mas vamos la vou tentar te ajudar já que você não pode auterar

1 pra você acrescentar 1 zero no mes e ficar certo você faz assim:

$mes = sprintf("%02d", $mes);

dai se o mes tiver exemplo 8 ele vai deixar 08

entendeu?

estou gravando separadamente, (dia, mes e ano).

Resposta:

se ta a data separada você monta ela exemplo:

$data = "$dia/$mes/$ano";

entendeu você pega os valores do dia, mes e ano e monta na variavel data

Link para o comentário
Compartilhar em outros sites

  • 0

fabyo, valeu aí pela ajuda cara! Demorei um pouco a responder mas você não me quebrou nem um galho, foi logo uma árvore! Matou minha pane.

Valeu mesmo! biggrin.gif

PS: entendi o funcionamento sim, agora só uma dúvida, você concatenou as variáveis assim:

$data = "$dia/$mes/$ano";

Eu utilizo ponto assim $data = "$dia.$mes.$ano";

Tem alguma diferença? ou com a barra seria melhor?

Abraço!

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...