Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Viva pessoal,
Estou com uma dificuldade de fazer uma situação ...
gostaria de efectuar uma consulta entre duas datas, devolvendo o numero de dias consultados, até ai tudo bem , o problema esta na seguinte situação, tenho estipuladas duas épocas o que quer dizer que por vezes a pessoa ao efectuar a selecção poderá seleccionar a época A e parte da Época B.
O que pretendo fazer é devolver os dias referentes a época A e os referentes a época B . Tem como me ajudar
É só usar between mesmo.
faça uma consulta mais abrangente entre as datas. Ex:
$data01 = 01/01/2015
$data02 = 31/01/2015
Vamos supor que existe uma 'época' entre 15/01 e 31/01.
Depois de trazer o resultado da consulta usando between, é só verificar se o registro corrente está dentro da época. Aí você faz o que quiser.
Ok essa parte eu entendi, mas imagina que a 'epoca' de 15/01 até 25/01/ têm um preço e de 26/01 a 31/01 outro como posso resolver esse problema?
A primeira situação e esta última são completamente diferentes... afinal de contas, qual é o resultado que você espera obter desta consulta?
Vamos por partes,
"gostaria de efectuar uma consulta entre duas datas, devolvendo o numero de dias consultados, até ai tudo bem , o problema esta na seguinte situação, tenho estipuladas duas épocas o que quer dizer que por vezes a pessoa ao efectuar a selecção poderá seleccionar a época A e parte da Época B".
Agora imagine:
as épocas têm preços diferenciados, "mas imagina que a 'epoca' de 15/01 até 25/01/ têm um preço e de 26/01 a 31/01 outro como posso resolver esse problema"
O resultado, esperado seria uma contagem dos dias com o preço de época A e a contagem dos dias com preço da época B... a partir dai eu ja poderei modelar o problema da forma que pretender.
Use o count para contar os dois e o group by para agrupar pelos valores, no modelo que você passou vai funcionar, mas se por exemplo vc tiver:
15/01 a 20/01 - R$150,00
21/01 a 23/01 - R$ 160,00
24/01 a 31/01 - R$ 150,00
Já não vai funcionar... ou seja, se existirem valores iguais para épocas diferentes, ai o que passei vai retornar um erro baseado na sua lógica...
os valores nunca vão ser iguais e épocas só serão duas sempre, será que voce me pode dar um exemplo? estou mesmo com dificuldade em fazer isso.
SELECT COUNT(dias) as total, dias, valor FROM tabela WHERE dias BETWEEN '$data1' AND '$data2' GROUP BY valor
valor = campo onde estará o valor (deve ser um campo adequado para valores monetários);
dias = campo da data (deve ser um campo adequado para datas);
$data1 = data inicial no formato adequado;
$data2 = data final no formato adequado.
gracias vou tentar aqui
bom ESerra isto não esta fácil... vou-lhe mostrar as minhas tabelas...
#tbl_epocas
id_epocas
epoca_initA
epoca_endA
epoca_initB
epoca_endB
epoca_initC
epoca_endC
produto_id
#tbl_epoca_preco
id_epoca_preco
qnt_tipo
adulto
crianca
preco1
preco2
preco3
produto_id
#tbl_produto
id_produto
nome_produto
o problema esta no seguinte a selecção de verificar entre a tabela época em que intervalo se situa, contando os dias pertencentes ao preço, e ao preço
Qual o SGBD que você está utilizando?
MySql
Como esta é uma questão de modelagem/query, movendo de PHP para MySQL.
pois Eserra não estou conseguindo modelar já virei aqui o dia todo tentando nada .
Pelo que entendi a tabela de "epocas" está mal modelada pois um registro aponta pra 3 épocas e preços distintos, seria isto !?
Ola Motta,
Sim o utilizador no painel de administração segundo o alojamento tem a hipótese de definir 3 épocas "alta","baixa","media", de tal forma que quando o usuário normal através de um data picker selecciona o espaço entre datas deveria verificar qual das épocas em que caiu a consulta, após isso a ideia seria efectuar uma contagem dos dias requeridos. agora imaginando que o intervalo teria metade dos dias com "alta" outra metade "media" ele iria devolver a quantidade de dias com o preço 1 e a quantidade de dias com o preço 2.
Ao meu ver o primeiro passo seria normalizar a tabela , a sql para consultar isto seria quase trivial.
Se eu tivrr tempo amanhã te posto uma solução
Seria algo assim , apenas um rascunho , deve ter erros
##tbl_tipo_epocas
id_tipo_epoca
descricao
#tbl_epocas
id_epoca
tipo_epoca
epoca_init
epoca_end
produto_id
#tbl_tipo_diaria
id_tipo_diaria (adulto crianca)
descricao
#tbl_epoca_preco
id_epoca_preco
id_epoca
produto_idid_tipo_diaria
valid_init
valid_end
preco
#tbl_produto
id_produto
nome_produto
--precos
select *
from tbl_epocas , tbl_epoca_preco
where tbl_epocas.id_epoca , tbl_epoca_preco.id_epoca
and currdate() between tbl_epoca_preco.valid_init and coalesce(tbl_epoca_preco.valid_init,currdate()) --preco "hoje"
and ((<data busca inicio> between tbl_epocas.epoca_init and tbl_epocas.epoca_end and
<data busca final> between tbl_epocas.epoca_init and tbl_epocas.epoca_end)
or
(tbl_epocas.epoca_init between <data busca inicio> and <data busca final> and
tbl_epocas.epoca_end between <data busca inicio> and <data busca final>)
Veja se ajudaObrigado motta , pela ajuda , mas as tabelas que me foram dadas , foram aquelas e tenho de modelar o problema com elas .
Me corrija o raciocinio se não estiver correcto
A ideia será através de um data picker são seleccionadas duas datas.
O que devo fazer neste caso será seleccionar a tabela [#tbl_epocas] e trazer todos as linhas afectas ao produto_id (a partida só mostra 1).
Imaginando que o que devolve é o seguinte :
|id| inicioA | terminoA | inicioB | terminoB | inicioC | terminoC |
--------------------------------------------------------------
|1|20-1-2015|25-1-2015|26-1-2015|30-1-2015|10-8-2015|20-9-2015|
Agora a questão é imagina que com o data picker terei de verificar se existem dias a cair dentro destas situações, tipo sera que com if's consigo resolver a questão?
tipo :
if($datapicker1 >='inicioA' && $datapicker2 <=terminoA ){
aqui so mostra os dias que calharam este esta data
///mostra preco1
}
else if($datapicker1 >='inicioB' && $datapicker2 <=terminoB){
aqui so mostra os dias que calharam este esta data
///mostra preco2
}
else if($datapicker1 >='inicioC' && $datapicker2 <=terminoC){
aqui so mostra os dias que calharam este esta data
///mostra preco3
}
A logica que eu pensei seria assim, desculpem a "má explicação"
Obrigado
O problema de um mal modelo é que le demanda soluções complexas para problemas simples , sinceramente não sei como resolver , talvez transformar as colunas em linha por um UNION
select inicioa , fima
from tabela
union all
select iniciob , fimb
from tabela
...
Mota consegui fazer o que queria , e trazer os valores com um array associativo agora estou com um problema de modelação de dados caso você me consiga dar uma ajuda fico-lhe muito grato, agora estou com dificuldade em verificar a de dias de cada uma das épocas que calha em cada uma das situações isso agora esta desta forma:
<?
$entryDate = $_GET['source1'];
$exitDate = $_GET['source2'];
$result2 = mysql_query("SELECT tbl_produto.id_produto, tbl_epocas.epoca_initA, tbl_epocas.epoca_endA, tbl_epocas.epoca_initB, tbl_epocas.epoca_endB,tbl_epocas.epoca_initC, tbl_epocas.epoca_endC,
tbl_epoca_preco.id_epoca_preco, tbl_epoca_preco.alojamento,tbl_epoca_preco.qnt_tipo,tbl_epoca_preco.adulto,tbl_epoca_preco.crianca, tbl_epoca_preco.preco_1,tbl_epoca_preco.preco_2,tbl_epoca_preco.preco_3 FROM tbl_produto INNER JOIN tbl_epocas INNER JOIN tbl_epoca_preco WHERE tbl_produto.id_produto = tbl_epocas.produto_id AND tbl_produto.id_produto = tbl_epoca_preco.produto_id AND tbl_produto.id_produto =".$_GET['id']." ORDER BY alojamento ASC");
$rooms = array();
while( $row2 = mysql_fetch_array($result2)){
$id_alojamento = $row2['alojamento'];
$rooms[] = $id_alojamento;
$rooms[ $id_alojamento ] = array('A','B','C');
$rooms[ $id_alojamento ]['A'][] = $row2['epoca_initA'];
$rooms[ $id_alojamento ]['A'][] = $row2['epoca_endA'];
$rooms[ $id_alojamento ]['A'][] = $row2['preco_1'];
$rooms[ $id_alojamento ]['A'][] = 0;//numDays
$rooms[ $id_alojamento ]['B'][] = $row2['epoca_initB'];
$rooms[ $id_alojamento ]['B'][] = $row2['epoca_endB'];
$rooms[ $id_alojamento ]['B'][] = $row2['preco_2'];
$rooms[ $id_alojamento ]['B'][] = 0;//numDays
$rooms[ $id_alojamento ]['C'][] = $row2['epoca_initC'];
$rooms[ $id_alojamento ]['C'][] = $row2['epoca_endC'];
$rooms[ $id_alojamento ]['C'][] = $row2['preco_3'];
$rooms[ $id_alojamento ]['C'][] = 0;//numDays
}
//en = entryDate = data de entrada do quarto
//ex = exitDate = data de saida do quarto
//endDate = fim da epoca
//startDate = inicio da epoca
//
//1º |_________________|___en____ex___|______________| startDate < en < endDate && startDate < ex < endDate : numDays = ex - end
//2º |_________________|___en_________|_____ex_______| startDate < en < endDate && ex > endDate : numDays = endData - en
//3º |____________en___|_________ex___|______________| en < startDate && startDate < ex < endDate : numDays = ex - startDate
//4º |____________en___|______________|_____ex_______| en < endDate && ex > endDate : numDays = endDate . startDate
foreach($rooms as $key_alojamento => $epocas){
foreach($epocas as $epoca){
echo $epoca[2]. '</br>';
echo $exitDate;
if($epoca[0] < $entryDate && $epoca[0] < $exitDate){
//exit +=
}else if($epoca[0] < $entryDate && $exitDate > $epoca[1]){
//exit +=
}else if($entryDate < $epoca[0] && $epoca[0] < $exitDate){
//exit +=
}else if($exitDate < $epoca[1] && $exitDate > $epoca[1]){
//exit +=
}
}
}
?>
Obrigado por sua ajuda
Repito, seu problema é de modelo.
Mas eu tentaria fazer a query com unions para resolver isto. (#21)
Dê exemplos de época, em vez de variáveis.