Ir para conteúdo

POWERED BY:

Arquivado

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

Mateus Aziani

separar dias dentro de duas datas

Recommended Posts

Pessoal, boa tarde!

Gostaria de pedir a ajuda de vocês para um problema que estou enfrentando e não sei como lidar. O problema é o seguinte:

Possuo duas datas, uma inicial e outra final. Meu sistema executa uma consulta no MySQL e me retorna todos os registros entre essas duas datas. Cada registro também possui uma data inicial e final.

 

Como eu posso separar os dias entre a data inicial e a final buscada de acordo com os resultados obtidos? Por exemplo:

 

Considerando que tenho 2 registros, o primeiro do dia 01/10/2013 ao dia 31/10/2013 e o segundo do dia 01/11/2013 ao dia 30/11/2013

para uma consulta feita entre os dias 10/10/2013 e 10/11/2013 me retorne algo como:

 

 

Do dia 10/10/2013 ao dia 31/10/2013 - registro 1

Do dia 01/11/2013 ao dia 10/11/2013 - registro 2

 

 

Não sei se ficou claro, mas basicamente é isso. Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

É isso que você precisa?

 

SELECT * FROM tabela WHERE campoData BETWEEN ’2013-10-10′ AND ’2013-10-31′ - Retorna registro 01

SELECT * FROM tabela WHERE campoData BETWEEN ’2013-11-01′ AND ’2013-11-10′ - Retorna registro 02

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não, Maykel-ctba, A consulta eu já tenho e funciona perfeitamente. Eu preciso saber como 'divido' corretamente o periodo buscado dentre os resultados obtidos pela consulta, uma vez que os resultados tambem possuem data inicial e final.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Segue a página completa:

 

<!DOCTYPE HTML><html><head><meta charset="iso-8859-1">	<title>Resultado da cotação</title></head><body>	<h1>Agência de Turismo Olímpia</h1>	<?php	//cria as variaveis	$id_hotel	 = $_POST['id_hotel'];	$datainicial = $_POST['datainicial'];	$datafinal 	 = $_POST['datafinal'];	$qtd_05	     = $_POST['qtd_05'];	$qtd_12	     = $_POST['qtd_12'];	$qtd_adulto  = $_POST['qtd_adulto'];	//cria as novas variaveis e converte o valor para o padrão americano	$datainicial = implode("-",array_reverse(explode("/",$datainicial)));	$datafinal = implode("-",array_reverse(explode("/",$datafinal)));	//cria as novas variaveis e converte o valor para o padrão americano	$one = new DateTime(implode("-", array_reverse(explode("/", $datainicial))));	$two = new DateTime(implode("-", array_reverse(explode("/", $datafinal))));		// Conexão com o Banco de Dados	mysql_connect("localhost", "root", "") or die (mysql_error ());	// Seleciona o Banco de Dados	mysql_select_db("cotacao") or die(mysql_error());	//query SQL	$strSQL = " SELECT * 				FROM diarias_tb				WHERE id_hotel = ('$id_hotel')				AND ((datainicial_diaria between ('$datainicial') and ('$datafinal'))				OR (datafinal_diaria between ('$datainicial') and ('$datafinal'))				OR (('$datainicial') between datainicial_diaria and datafinal_diaria)				OR (('$datafinal') between datainicial_diaria and datafinal_diaria))";	// Executa a query (o recordset $rs contém o resultado da query)	$rs = mysql_query($strSQL);	// Executa a query (o recordset $rs contém o resultado da query)	$rs = mysql_query($strSQL);					// Loop pelo recordset $rs	// Cada linha vai para um array ($row) usando mysql_fetch_array	// faz a contagem do numero de pessoas	$qtd_diaria = 0; 	$qtd_diaria = $qtd_05 + $qtd_12 + $qtd_adulto;	//informa a mensagem de erro caso algum campo não seja preenchido, se não exibe o conteúdo	if($qtd_diaria == 0 OR $datainicial == 0 OR $datafinal = 0 )	{		echo 'Por favor, preencha todos os campos do formulário para que a cotação seja executada.<br />';	}	else	{			echo '<h3>Informações gerais</h3>';		// Resgata diferença entre as datas		$dateInterval = $one->diff($two);			echo 'Cotação para '.$dateInterval->days.' dia(s)<br /><br>';				//EXIBE AS DIÁRIAS A PARTIR DAQUI		// Loop. Cada linha vai para um array ($row) usando mysql_fetch_array		while($row = mysql_fetch_array($rs)) {		echo 'Valor da diária - Inteira: ' .$row['precoadulto_diaria'].'<br>';		echo 'Nome da Diária:   '.$row['nome_diaria'].'<br><hr>';		}                        // Encerra a conexão		mysql_close();		}	?>     </body></html>

 

 

se for mais fácil, poderia ser também que o código me retorna somente quantos dias são cada diária. Isso também resolveria perfeitamente (e até melhor) o meu problema.

 

 

 

 

Nada, galera? :/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu não entendi a dificuldade em fazer o que você quer, contudo ainda acho que a sua modelagem está errada, além do que, aquela sua query na minha opinião tende a criar um gargalo e prejudicar a escalabilidade do sistema.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu apanhei um monte em outro forum aqui para conseguir que a query buscasse os resultados corretamente como busca no momento. Essa foi a única que realmente funcionou como eu precisava.

Vou simplificar o que eu preciso e qual a minha difucldade:

// Loop. Cada linha vai para um array ($row) usando mysql_fetch_array
while($row = mysql_fetch_array($rs)) {
echo 'Valor da diária - Inteira: ' .$row['precoadulto_diaria'].'<br>';
echo 'Nome da Diária:   '.$row['nome_diaria'].'<br><hr>';
}

Simulando que nesse loop, com uma busca um período de duas datas ele me retorne 3 resultados, que junto com esse trecho de código escreva a quantidade de dias que estão dentro de cada resultado.

Exemplo:

Considerando que existem 3 diárias cadastradas no sistema, sendo elas:

Diária de Outubro - 01/10/2013 a 31/10/2013 - R$ 100,00
Diária de Novembro - 01/11/2013 a 31/11/2013 - R$ 200,00
Diária de Dezembro - 01/12/2013 a 31/12/2013 - R$ 300,00

E o cliente realize uma busca entre as datas 10/10/2013 e 10/12/2013

 

ele exiba dessa forma:

--------------------------------------------------------------------------

Dias nessa diária - 21
Valor da diária - Inteira: R$ 100,00
Nome da Diária - Diária de Outubro

--------------------------------------------------------------------------

Dias nessa diária - 31
Valor da diária - Inteira: R$ 200,00
Nome da Diária - Diária de Novembro

--------------------------------------------------------------------------

Dias nessa diária - 10
Valor da diária - Inteira: R$ 300,00
Nome da Diária - Diária de Dezembro

--------------------------------------------------------------------------

 

 

Eu não faço ideia como fazer isso. como mostrar quantos dias são de cada diária.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Intendi bem? Voce quer a diferença dos dias que a pessoa selecionou nas datas, entao $one - $two?Ou voce quer qual o valor da Diaria naquele dia que a pessoa selecionou?
// Loop. Cada linha vai para um array ($row) usando mysql_fetch_array
while($row = mysql_fetch_array($rs)) {
 --------------------------------------------------------------------------
 echo 'Dias nessa diária - ' . intval($one) - intval($two);
 echo 'Valor da diária - Inteira: ' .$row['precoadulto_diaria'].'';
 echo 'Nome da Diária: '.$row['nome_diaria'].'';
}

 

Não sei se é permitido, mas uma breve pesquisa no google já encontramos o que resolve seu problema..

 

http://www.davidchc.com.br/video-aula/php/calculando-intervalo-entre-datas-com-php/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Thadeu, eu quero a quantidade de dias em cada diária retornada a partir dos dias que a pessoa selecionou nas datas.

Infelizmente dessa forma não funcionou. Sobre o link que você postou, eu acredito que isso não resolveria o meu problema uma vez que eu não quero a diferença entre só duas datas.

Como eu saberia qual é o $inicio e $fim de cada resultado?

 

Ficou assim aqui:

 


Notice: Object of class DateTime could not be converted to int in C:\Program Files\EasyPHP-12.1\www\cotacao\calcularcotacao.php on line 106

Notice: Object of class DateTime could not be converted to int in C:\Program Files\EasyPHP-12.1\www\cotacao\calcularcotacao.php on line 106
-1Valor da diária - Inteira: 100.00Nome da Diária: Setembro
Notice: Object of class DateTime could not be converted to int in C:\Program Files\EasyPHP-12.1\www\cotacao\calcularcotacao.php on line 106

Notice: Object of class DateTime could not be converted to int in C:\Program Files\EasyPHP-12.1\www\cotacao\calcularcotacao.php on line 106
-1Valor da diária - Inteira: 150.00Nome da Diária: Outubro
Notice: Object of class DateTime could not be converted to int in C:\Program Files\EasyPHP-12.1\www\cotacao\calcularcotacao.php on line 106

Notice: Object of class DateTime could not be converted to int in C:\Program Files\EasyPHP-12.1\www\cotacao\calcularcotacao.php on line 106
-1Valor da diária - Inteira: 200.00Nome da Diária: Novembro



Atualizando aqui!

Thadeu, obrigado!! eu já tinha visto coisas parecidas várias vezes mas agora pensei em algo que não tinha pensando que pode dar certo.

Acho que se eu adaptar a função pode funcionar!

é possivel colocar um if else dentro de parenteses em uma função?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, da uma estudada depois em relação a paradigmas de programação php e as melhores praticas a serem utilizadas!

Dae voce vai pensar 2x antes de querer fazer um if-else dentro de um parametro funcional rsr..

 

Segue o site:

http://br.phptherightway.com/

 

Existe muita informação obsoleta na Web que desnorteia novos programadores PHP, espalhando más práticas e péssimo código. Isto precisa acabar.PHP: Do Jeito Certo é uma referência rápida de melhores práticas de PHP, renomados padrões de código e links para tutoriais competentes pela Web.

 

Em relação à função do intervalo, faz ela recursiva dentro do while que vai dar certo e voce vai resolver o problema.



Mateus, olha so essa classe nova do PHP para tratamento de datas.

 

http://br.phptherightway.com/#the_basics

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dei uma olhada no site e é bem legal mesmo. Sou iniciante no assunto, sempre trabalhei com front-end e confesso que tenho apanhado um pouco, assim como no front-end aprendi da maneira mais difícil para depois a 'limpa' parecer mais fácil rs

 

Eu me equivoquei na pergunta. A Ideia do If else seria para comparar as duas datas:

 

data inicial buscada - data inicial da diária cadastrada no bd

data final buscada - data final da diária cadastrada no bd

 

Com a comparação feita, o php chama a função que faz a contagem dos dias. num mundo perfeito parece funcionar, já no mundo real...você acha que fica possível dessa forma?

 

 

Realmente não consigo pensar em nada que resolva isso. Se tiver qualquer sugestão, é mais que bem vinda.

 

 

Acho que minha ideia de comparar as datas também não vai funcionar. :(

 

 

 

 

Pessoal, mudei minha query:

 

 

 

datafinal_diaria e datainicial_diaria são as datas da diaria cadastrada no sistema.

SELECT	*, DATEDIFF(d.datafinal_diaria, d.datainicial_diaria) DiasDiariaFROM	diarias_tb dWHERE	id_hotel='6'	AND 	((datainicial_diaria between '2013-09-01' and '2014-01-04') OR (datafinal_diaria between '2013-09-01' and '2014-01-04'))

Dessa forma é QUASE o que eu to tentando. Ela me retorna TODOS os dias daquela diária cadastrada. Alguém sabe como me dizer como eu faria para que ela retornasse apenas os dias que estão naquela diária? Por exemplo.

 

Se a diaria começa dia 01/10 e termina 30/10, me exibir '20' e não '30' como ocorre no momento.

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.