Ir para conteúdo

Arquivado

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

weikan_1991

[DÚVIDA] - Função Between(SQL) não inclui data de hoje.

Recommended Posts

Olá.

 

Estou fazendo um sistema simples de busca entre datas numa tabela do mysql. Digamos que eu queira pesquisar apenas por registros feitos pelo meu usuário no dia de hoje. Há dois campos: Data Inicial e Data Final, coloco a data de hoje em ambos os campos e ele me retorna todos os registro de hoje. Acontece que ele não inclui a data de hoje na pesquisa. Para aparecer os registros feitos hoje, eu tenho que colocar a data de ontem como data inicial e a data de hoje como data final.

 

Segue o código página onde se insere as datas:

<html>
<head>
<title>Meus Relatórios</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style>
.meio{
	width:1420;
	height: auto;
	padding-top:20;
	padding-bottom:20;
	margin:0 auto;
	border:thin dotted;
	border-radius:4px;
	}
.tpc{
	font-family:"Trebuchet MS", Arial, Helvetica, sans-serif;
	font-size:14px;
	color:#666;
	}
.tpc1{
	font-family:"Trebuchet MS", Arial, Helvetica, sans-serif;
	font-size:9px;
	color:#999;
	}
</style>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js" type="text/javascript"></script>
<script src="js/mask.js" type="text/javascript"></script>
<script>
jQuery(function($){
   $("#dt1").mask("99-99-9999",{placeholder:" "});
});
jQuery(function($){
   $("#dt2").mask("99-99-9999",{placeholder:" "});
});

function validar(){
	if(document.datas.dt1.value == '' || document.datas.dt2.value == ''){
		alert("Insira todas as datas!");
		return false;
		}else if(document.datas.dt1.length < 10 || document.datas.dt2.length < 10){
			alert("Data inválida! formato: dd/mm/aaaa");
			return false;
			}else{
				return true;
				}
	}
</script>
</head>
<body>
<?php
session_start();
$us1 = $_SESSION['nome'];
?>
<?php include "topo.php"; ?>
<div class="meio">
<form name="datas" method="post" onsubmit="return validar();" action="ver_relatorios.php">
<table align="center" class="tbc">
<tr>
<td align="left" colspan="3">
<p class="tpc">Usuário: <?php echo $us1; ?></p>
</td>
</tr>
<tr>
<td>
<br/>
</td>
</tr>
<tr>
<td align="left">
<p class="tpc">Data Inicial: </p>
</td>
<td align="left">
<input class="text" maxlength="10" size="6" name="dt1" id="dt1"/>
</td>
<td align="left">
<p class="tpc1">dd-mm-aaaa</p>
</td>
</tr>
<tr>
<td align="left">
<p class="tpc">Data Final: </p>
</td>
<td align="left">
<input class="text" maxlength="10" size="6" name="dt2" id="dt2"/>
</td>
<td align="left">
<p class="tpc1">dd-mm-aaaa</p>
</td>
</tr>
<tr>
<td>
<br/>
</td>
</tr>
<tr>
<td colspan="3" align="center">
<input type="submit" value="Enviar"/>
</td>
</tr>
<tr>
<td>
<br/>
</td>
</tr>
<tr>
<td>
<br/>
</td>
</tr>
<tr>
<td colspan="3" align="center">
<a href="voltar.php">Voltar</a>
</td>
</tr>
</table>
</div>
<?php include "rodape.php"; ?>
</body>
</html>

Página onde são exibidos os relatórios:

<html>
<head>
<title>Validando...</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style>
.tbc{
	width:1420;
	height:auto;
	border:thin dotted;
	border-radius:4px;
	}
.tdc{
	border:thin dotted;
	border-radius:4px;
	padding:6;
	}
.tdc:hover{
	background-color:#FFC;
	}
.td1{
	height:80;
	}
.tpc{
	font-family:"Trebuchet MS", Arial, Helvetica, sans-serif;
	font-size:14px;
	color:#666;
	text-align:justify;
	}
.tpc1{
	font-family:"Trebuchet MS", Arial, Helvetica, sans-serif;
	font-size:14px;
	color:#666;
	}
</style>
<script>
function voltar(){
	setTimeout("window.Location='meus_relatorios.php'",2000);
	}
</script>
</head>
<body>
<?php
session_start();
$us1 = $_SESSION['nome'];
$dat1 = $_POST['dt1'];
$dat2 = $_POST['dt2'];
include "conexao.php";
$sql = "SELECT * FROM relatos WHERE usuario = '$us1' AND date_format(dat,'%d %m %y') BETWEEN '$dat1' AND '$dat2'";
$query = mysql_query($sql) or die(mysql_error());
?>
<?php //include "topo.php"; ?>
<table class="tbc" align="center">
<tr>
<td align="center" class="tdc">
<p class="tpc1"><b>Atividades Realizadas</b></p>
</td>
<td align="center" class="tdc">
<p class="tpc1"><b>Dificuldades Encontradas</b></p>
</td>
<td align="center" class="tdc">
<p class="tpc1"><b>Problemas Solucionados</b></p>
</td>
<td align="center" class="tdc">
<p class="tpc1"><b>Rota de Ação</b></p>
</td>
<td align="center" class="tdc">
<p class="tpc1"><b>Usuário</b></p>
</td>
<td align="center" class="tdc">
<p class="tpc1"><b>Data</b></p>
</td>
</tr>
<?php
while ($lista = mysql_fetch_array($query)){
	?>
    <tr>
    <td class="tdc" align="center">
    <p class="tpc"><?php echo $lista['qt1']; ?></p>
    </td>
    <td class="tdc" align="center">
    <p class="tpc"><?php echo $lista['qt2']; ?></p>
    </td>
    <td class="tdc" align="center">
    <p class="tpc"><?php echo $lista['qt3']; ?></p>
    </td>
    <td class="tdc" align="center">
    <p class="tpc"><?php echo $lista['qt4']; ?></p>
    </td>
    <td class="tdc" align="center">
    <p class="tpc"><?php echo $lista['usuario']; ?></p>
    </td>
    <td class="tdc" align="center">
    <p class="tpc"><?php echo substr($lista['dat'],8,2)."/".substr($lista['dat'],5,2)."/".substr($lista['dat'],0,4); ?></p>
    </td>
    </tr>
    <?php
	}
?>
<tr>
<td align="left" class="td1">
<p class="">Obs:</p>
</td>
<td colspan="6"></td>
</tr>
<table>
<table align="center">
<tr>
<td>
<br/>
</td>
</tr>
<tr>
<td>
<br/>
</td>
</tr>
<tr>
<td colspan="7" align="center">
<a href="voltar.php">Voltar</a>
</td>
</tr>
</table>
<?php
//include "rodape.php";
?>
</body>
</html>

Eu queria que a data de hoje estivesse inclusa na pesquisa.

 

Obrigado pela atenção.

 

Até!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Segue a query:

create table if not exists relatos(
id int not null auto_increment,
qt1 varchar(500) not null,
qt2 varchar(500) not null,
qt3 varchar(500) not null,
qt4 varchar(500) not null,
usuario varchar(30) not null,
dat datetime not null,
primary key(id));

$sql = "SELECT * FROM relatos WHERE usuario = '$us1' AND date_format(dat,'%d %m %y') BETWEEN '$dat1' AND '$dat2'";

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não o create table rs. Esse trecho

 

  1. $sql = "SELECT * FROM relatos WHERE usuario = '$us1' AND date_format(dat,'%d %m %y') BETWEEN '$dat1' AND '$dat2'";
    echo $sql;//posta isso hehe
  2.  

Compartilhar este post


Link para o post
Compartilhar em outros sites

SELECT * FROM relatos WHERE usuario = 'anderson' AND date_format(dat,'%d %m %y') BETWEEN '04-07-2016' AND '04-07-2016'

 

isso no caso da data de hoje.

 

SELECT * FROM relatos WHERE usuario = 'anderson' AND date_format(dat,'%d %m %y') BETWEEN '04-07-2016' AND '20-07-2016'

 

nesse caso ele deveria mostrar todos os registros da data de hoje também.

Compartilhar este post


Link para o post
Compartilhar em outros sites

As vezes isso é um pouco confuso. Principalmente quanto ao formato de data. Utilize o formato padrão (yyyy-mm-dd).

SELECT * FROM relatos WHERE usuario = 'anderson' AND date_format(dat,'%Y-%m-%d') BETWEEN '2016-07-04' AND '2016-07-04'

O between deve incluir os limítrofes, ou seja, é igual aos operadores >= e <=.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Experimente date_format(dat,'%d-%m-%Y')

SELECT * FROM relatos WHERE usuario = 'anderson' AND date_format(dat,'%d-%m-%Y') BETWEEN '04-07-2016' AND '20-07-2016'

Compartilhar este post


Link para o post
Compartilhar em outros sites

Marcos

 

Tentei formatar os traços entre os itens da data como você sugeriu mas o erro continua o mesmo.

 

Gabriel

 

Formatei as datas de entrada para "Y-m-d" e fiz o between com as datas nesse mesmo formato e o erro persiste.

 

O problema é que a busca não inclui itens com a data do dia de hoje. Por exemplo:

 

Data1: 05/07/2016

Data2: 05/07/2016

 

Quando eu faço a busca, ele deveria me retornar todos os registros de hoje. Não está retornando item nenhum.

 

Outro exemplo:

 

Data1: 05/07/2016.

Data2: 10/07/2016.

 

Quando faço a busca, retorna todos os itens com data de hoje. Não está retornando item nenhum.

 

Outro exemplo:

 

Data1: 04/07/2016.

Data2: 05/07/2016.

 

Quando faço a busca, ele deve retornar os registros de ontem e de hoje, porém ele só retorna os registros do dia 04.

 

Alguma outra ideia?

 

Obrigado pela atenção.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já tive exatamente este problema usando o between, solução que usei foi => AND <=, pronto. Não sei se isto é um bug de alguma versão do MySQL, mas de fato em alguns casos simplesmente ele age como > AND < apenas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

ESerra

 

Funcionou!

Utilizei as datas de entrada no formato 'dd/mm/aaaa' e a data no banco de dados com format_date(%d-%m-%Y) e os sinais >= e <= ou invés de BETWEEN.

 

Valeu!

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.