Ir para conteúdo

POWERED BY:

Arquivado

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

Robinho de Morais

[Resolvido] Subtrair Datas

Recommended Posts

Olá pessoal estou aqui precisando de mais ajuda de voçês do forum,

 

 

No meu Banco mysql eu gravo a dataaberto tipo date entao ele fica assim (2010-12-20) e eu gravo quando fecho o processo com a datafechado tipo date também;

 

Agora o que eu não sei fazer é pegar essas duas datas e e saber quantos dias tipo assim:

 

dataaberto : 15/12/2010 - datafechado : 20/12/2010 e se nao tiver nada na datafechado pegar a data atual e apresentar o resultado em dias...entao seria

5 dias.....o problema é que tem que converter a data para o formato brasileiro e fazer a subtração..

 

Alguém dá uma ajuda ai

 

valew obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

damos sim :)

A função DATEDIFF() é usada quando precisamos obter a diferença entre duas datas. Ela aceita dois argumentos: expr1 e expr2 e retorna expr1 – expr2 como um valor em dias de uma data para a outra. Tanto expr1 quanto expr2 são campos do tipo DATE, DATETIME ou TIMESTAMP. Somente a parte date é usada nos cálculos. Veja um exemplo de seu uso:

 

 

 

http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_datediff

Compartilhar este post


Link para o post
Compartilhar em outros sites

Veja se ajuda ?

 

function EntreDatas( $inicio, $fim ){
         $aInicio = Explode( "/",$inicio );
         $aFim    = Explode( "/",$fim    );
         $nTempo = mktime(0,0,0,$aFim[1],$aFim[0],$aFim[2]);
         $nTempo1= mktime(0,0,0,$aInicio[1],$aInicio[0],$aInicio[2]);
         return round(($nTempo-$nTempo1)/86400);
    }

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se os dados estão no BD MySQL, use DATEDIFF, como o Kakaroto mostrou.

 

Se precisar manipular via PHP, o PHP tem a classe DateTime, que tem o método diff()

 

http://www.php.net/manual/en/datetime.diff.php

 

Veja:

http://www.rberaldo.com.br/blog/2010/01/14/php-usando-a-classe-nativa-datetime/

Compartilhar este post


Link para o post
Compartilhar em outros sites

opa excelente partida.....mas uma ajuda pra terminar.....

 

 

function listaSolicitacoes()
{          


	$sql=mysql_query("select * from solicitacoes");	



	$linhas['lista']="";
	$num=0;
	while($linha=mysql_fetch_object($sql)){
		$linhas['lista'][$num]['controle']    =$linha->controle;
		$linhas['lista'][$num]['dtinclusao']  =$linha->dtinclusao;
		$linhas['lista'][$num]['sistema']	  =$linha->sistema;
		$linhas['lista'][$num]['formulario']  =$linha->formulario;
		$linhas['lista'][$num]['situacao']	  =$linha->situacao;
		$linhas['lista'][$num]['dtconcluido'] =$linha->dtconcluido;
		$linhas['lista'][$num]['solicitacao'] =$linha->solicitacao;
		$linhas['lista'][$num]['status']	  =$linha->status;
		$linhas['lista'][$num]['observacao']  =$linha->observacao;	
		$linhas['lista'][$num]['topico']      =$linha->topico;	
		$linhas['lista'][$num]['urgente']     =$linha->urgente;	

		if ($dtconcluido != 0000-00-00)
		{
			$dias = $dtincluido->diff($dtconcluido);		
			$linhas['lista'][$num]['dias']     =$linha->dias;		
		}else
		{
			$dataatual = date("Y/m/d");		

			$dias = $dtincluido->diff($dataatual);		
			$linhas['lista'][$num]['dias']     =$linha->dias;					
		}


	$num++;	
	}
	return $linhas;	



}

 

 

estou consultando no banco mysql e se nao tiver ele calcula com o de hj, se tem data de concluido ele calcula com a data da consulta, e incluir no array para que eu possa mostrar no datagrid....

 

mas dá esse erro...

 

(Object)#0

message = "faultCode:INVALID_AMF_MESSAGE faultString:'Invalid AMF message' faultDetail:'

Fatal error: Call to a member function diff() on a non-object in C:\xampp\htdocs\AdmInfinity\bin-debug\amfphp\services\principal.php on line 54

'"

name = "Error"

rootCause = (null)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para mudar para o fuso-horário brasileiro, logo quando você for pegar as datas use isso:

 

date_default_timezone_set('Brazil/East');

 

Isso irá funcionar... Sobra a subtração, se você apenas quer saber qual data é maior, use a strtotime(). Algo do tipo:

 

<?php
$diaUm = strtotime('08.11.2010 12.30'); // formato data.mes.ano hora.minuto
$diaDois = strtotime('17.12.2011 14.00'); // mesmo formato

// para saber se a segunda data é maior, basta subtrair as duas...

$diferencia = $diaDois - $diaUm;

if($diferencia > 0){
  echo 'a segunda data é maior';
}elseif$diferencia < 0){
  echo 'a primeira data é maior';
}

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então mas eu fiz assim só para testar e ai funcionou:

function Dias()
{

	$datetime1 = new DateTime('2009-10-11');
	$datetime2 = new DateTime('2009-10-13');
	$interval = $datetime1->diff($datetime2);		
	return $interval->d;			

}

 

 

ai o que eu tinha que fazer é no meio da consulta, lá no while colocar pra fazer a conta e armazer no array....

não quero pegar horas e nem ver qual é maior ou menor...quero somente saber quantos dias tem entre duas datas;

 

Alguém poderia me ajudar ?

 

uma ajuda por favore

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim está retornando, mas o que eu preciso é pegar de todos os registros....tipo

 

 

Solicitação  DataInclusao      DataConcluido   Data Atual    Situação              Dias
   1         10/12/2010  -      20/12/2010                 Concluido          =  10 dias 
   2         18/12/2010  -      20/12/2010                 Concluido          =   2 dias
   3         15/12/2010  -      19/12/2010                 Cancelado          =   4 dias
   4         15/12/2010  -      18/12/2010                 Concluido          =   3 dias
   5         18/12/2010  -                    22/12/2010   Desenvolvendo      =   4 dias
   6         18/12/2010  -                    22/12/2010   Solicitado         =   4 dias
   7         22/12/2010  -                    22/12/2010   Solicitado         =   0 dias

Os que tem dataconcluido que está gravado no banco ai pega a data de inclusao e faz menos a data concluido

para os que nao está concluido vai pegar a data atual e fazer a datainclusao menos a data atual entao eu tinha q incluir tipo numa variavel array pra ai eu pegar linha por linha de cada solitação e jogar no sistema...

 

assim que estava querendo....

Compartilhar este post


Link para o post
Compartilhar em outros sites

E em que parte está a dúvida?

 

Veja os métodos da classe:

http://www.php.net/manual/en/class.datetime.php

 

Você pode mudar o timestamp da classe em qualquer momento da execução, então pode fazer quantos cálculos quiser.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entao o que nao estou sabendo é colocar o resultado na variavel lista, porque o ['controle'], ['dtinclusao'] é do banco de dados e o campo Dias não existe é uma informação que teria que incluir e apresentar

 

 

function listaSolicitacoes()
{          



	$sql=mysql_query("select * from solicitacoes");	



	$linhas['lista']="";
	$num=0;
	while($linha=mysql_fetch_object($sql)){
		$linhas['lista'][$num]['controle']    =$linha->controle;
		$linhas['lista'][$num]['dtinclusao']  =$linha->dtinclusao;
		$linhas['lista'][$num]['sistema']	  =$linha->sistema;
		$linhas['lista'][$num]['formulario']  =$linha->formulario;
		$linhas['lista'][$num]['situacao']	  =$linha->situacao;
		$linhas['lista'][$num]['dtconcluido'] =$linha->dtconcluido;
		$linhas['lista'][$num]['solicitacao'] =$linha->solicitacao;
		$linhas['lista'][$num]['status']	  =$linha->status;
		$linhas['lista'][$num]['observacao']  =$linha->observacao;	
		$linhas['lista'][$num]['topico']      =$linha->topico;	
		$linhas['lista'][$num]['urgente']     =$linha->urgente;	

		if ($dtconcluido > null)
		{
			$dias = $dtincluido->diff($dtconcluido);		
			$linhas['lista'][$num]['dias']     =$linha->dias;		
		}else
		{
			$dataatual = date("Y/m/d");

			$dias = $dtincluido->diff($dataatual);		
			$linhas['lista'][$num]['dias']     =$linha->$dias;				
		}


	$num++;	
	}
	return $linhas;	



}

 

Dessa maneira que fiz não tá dando certo......

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uffa nossa que sufoco foi .......

 

Obrigado a todos pela paciencia e colaboração de informações e ajuda.

Abaixo estou postando o codigo de como ficou.......

 

Resolvido

 

function listaSolicitacoes()
{          



	$sql=mysql_query("select * from solicitacoes");	



	$linhas['lista']="";
	$num=0;
	while($linha=mysql_fetch_object($sql)){
		$linhas['lista'][$num]['controle']    =$linha->controle;
		$linhas['lista'][$num]['dtinclusao']  =$linha->dtinclusao;
		$linhas['lista'][$num]['sistema']	  =$linha->sistema;
		$linhas['lista'][$num]['formulario']  =$linha->formulario;
		$linhas['lista'][$num]['situacao']	  =$linha->situacao;
		$linhas['lista'][$num]['dtconcluido'] =$linha->dtconcluido;
		$linhas['lista'][$num]['solicitacao'] =$linha->solicitacao;
		$linhas['lista'][$num]['status']	  =$linha->status;
		$linhas['lista'][$num]['observacao']  =$linha->observacao;	
		$linhas['lista'][$num]['topico']      =$linha->topico;	
		$linhas['lista'][$num]['urgente']     =$linha->urgente;	

		if ($dtconcluido != null)
		{

			$dtinclusao  = $linha->dtinclusao;				
			$dtconcluido = $linha->dtconcluido;						

			$datetime1 = new DateTime($dtinclusao);
			$datetime2 = new DateTime($dtconcluido);

			$dias = $datetime1->diff($datetime2);		

			$dias = $dias->d;	

		//	return $dias;


			$linhas['lista'][$num]['dias']  =dias;		
		}else
		{

			$dataatual = date("Y/m/d");
		    $dtinclusao = $linha->dtinclusao;				


			$datetime1 = new DateTime($dataatual);
			$datetime2 = new DateTime($dtinclusao);

			$dias = $datetime1->diff($datetime2);		

			$dias = $dias->d;		

			$linhas['lista'][$num]['dias']  =$dias;				
		}


	$num++;	
	}
	return $linhas;	



}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu sei que o tópico é antigo, mas como achei "quase" a solução para o meu problema aqui, gostaria de ressucitar o mesmo, pois preciso de ajuda.

 

Da forma que foi resolvido, retorna o intervalo de dias entre duas datas, mas somente considerando os dias. O que eu gostaria é que contasse os dias considerando também o mês e ano.

 

Por exemplo, na resolução deste tópico, o intevalo entre 2012-07-24 e 2012-07-26 é de dois dias, assim como é de dois dias o intervalo entre 2012-06-24 e 2012-07-26, quando na verdade, o intervalo ai seria de mais de 30 dias.

 

Alguém pode me ajudar?

 

 

Desde já agradeço,

Júlio

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

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