Jump to content


Photo

Problema Em Comparação De Datas Em Campo Varchar


  • Faça o login para participar
3 replies to this topic

#1 Gustavo de Brito

Gustavo de Brito

    Novato no fórum

  • Usuários
  • 10 posts
  • Sexo:Não informado

Posted 13/09/2010, 22:51

Fala pessoal, tudo bom? Vou direto ao assunto com os últimos neurônios que me restam.

Tenho um BD com um campo onde armazeno uma data no formato brasileiro dd/mm/aaaa e o tipo do campo é VARCHAR. Preciso agora realizar consultas neste banco, informando data inicial e final de um intervalo. Aí está o problema. Já tentei de toda a forma converter na hora a data para conseguir realizar a consulta, e para meu espanto, a sintaxe d/m/Y do date está me retornando a data invertida.

Agradeço se alguém conseguir me ajudar. A pesquisa abaixo, apesar de grande, funciona perfeitamente sem o between de datas em negrito que preciso inserir.

Segue o código:


<?php

require_once("connect.php"); 

[b]$data1 = date("d/m/Y", strtotime($_POST['data_search_ini']));[/b] //aqui já fica estranho pois quando dou um echo em outra parte do script a data capturada aparece como m/d/Y, ex: Se digitei 10/05/2010 aparece 05/10/2010, acho que aqui está o problema

[b]$data2 = date("d/m/Y", strtotime($_POST['data_search_ini2']));[/b]


?>

<html>
<head>
<meta http-equiv="Content-Language" content="pt-br">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<title>Pesquisa Intervalo Técnico</title>

<style type="text/css">
<!--
.arial12 {font-family: Arial, Helvetica, sans-serif;
}
.arial12 {font-size: 12px;
}
-->
</style>
</head>

<form id="form1" name="form1" method="post" action="hora5.php">
<p align="center">Teste de data</p>
<p align="center">data inicio = 
  <label>
  <input type="text" name="data_search_ini" id="data_search_ini">
  </label>
</p>
<p align="center">data t&eacute;rmino =
  <label>
  <input type="text" name="data_search_ini2" id="data_search_ini2">
  </label>
</p>
<p align="center">
  <label>
  <input type="submit" name="button" id="button" value="Pesquisa!!!">
  </label>
</p>
<p align="center">Data Pesquisada Inicial: <span class="arial12"><?php echo $data1; ?></span></p>
<p align="center">Data Pesquisada Final: <span class="arial12"><?php echo $data2; ?></span></p>
<table width="980" border="0" align="center" cellpadding="5">
  <tr bgcolor="#999999">
    <td width="101" bgcolor="#CCCCCC" class="arial12">Ordem</td>
    <td width="67" bgcolor="#CCCCCC" class="arial12">Teminal</td>
    <td width="86" bgcolor="#CCCCCC" class="arial12">Empresa</td>
    <td width="71" bgcolor="#CCCCCC" class="arial12">Tipo</td>
    <td width="81" bgcolor="#CCCCCC" class="arial12">Agendamento</td>
    <td width="53" bgcolor="#CCCCCC" class="arial12">Per&iacute;odo</td>
    <td width="229" bgcolor="#CCCCCC" class="arial12">T&eacute;cnico</td>
    <td width="194" bgcolor="#CCCCCC" class="arial12">Status</td>
  </tr>
  <?php

//consulta principal que lista os servi&ccedil;os

$painel = mysql_query ("SELECT ordem.id,ordem.ordem,ordem.terminal,tipo.tipo,ordem.data_agenda,periodo.periodo,tecnico.re,tecnico.nome,tecnico.telefone_celular,ordem.hora,usuarios.nome_completo,status.status,empresa.empresa
						
						FROM ordem
						
						JOIN tipo ON tipo.id = ordem.tipo						
						JOIN periodo ON periodo.id = ordem.periodo
						JOIN tecnico ON tecnico.id = ordem.tecnico						
						JOIN usuarios ON usuarios.id = ordem.usuario
						JOIN status ON status.id = ordem.status
						JOIN empresa ON empresa.id = ordem.empresa
						
						WHERE ordem.empresa = '1' AND ordem.status = '3' AND ordem.tipo ='0' [b]AND ordem.data_agenda BETWEEN '$data1' AND '$data2' [/b]
											
						ORDER BY ordem.data_agenda ASC
						
						");

$linhas = mysql_num_rows($painel);

while ($res = mysql_fetch_array($painel)){
	
	$p10 = $res[0];
	$p11 = $res[1];
	$p12 = $res[2];
	$p13 = $res[3];
	$p14 = $res[4];
	$p15 = $res[5];
	$p16 = $res[6];
	$p17 = $res[7];
	$p18 = $res[8];
	$p19 = $res[9];
	$p20 = $res[10];
	$p21 = $res[11];
	$p22 = $res[12];
	?>
  <tr>
    <td class="arial12"><?php print $p11; ?></td>
    <td class="arial12"><?php print $p12; ?></td>
    <td class="arial12"><?php print $p22; ?></td>
    <td class="arial12"><?php print $p13; ?></td>
    <td class="arial12"><?php print $p14; ?></td>
    <td class="arial12"><?php print $p15; ?></td>
    <td class="arial12"><?php print $p17; ?></td>
    <td class="arial12"><?php print $p21; ?></td>
  </tr>
  <?php
} 
?>
</table>
<p align="center">Total: <?php echo $linhas; ?> Resultados</p>
<p align="center">&nbsp;</p>
<p align="center">&nbsp;</p>
</form>
</body>
</html>


Muito obrigado.

Edição feita por: André Manoel, 14/09/2010, 15:51.
Postar código fonte entre as tags code


#2 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 14/09/2010, 06:05

O melhor que você faz é converter o seu campo pro tipo DATE e ajustar os seus dados. Essa coisa de data em VARCHAR não dá muito certo.

#3 Gustavo de Brito

Gustavo de Brito

    Novato no fórum

  • Usuários
  • 10 posts
  • Sexo:Não informado

Posted 14/09/2010, 08:40

O melhor que você faz é converter o seu campo pro tipo DATE e ajustar os seus dados. Essa coisa de data em VARCHAR não dá muito certo.


Obrigado pela ajuda.

Sei que o ideal seria utilizar o campo no formato date, mas a aplicação já está rodando.

Gostaria de saber se há uma forma de realizar esta consulta na situação atual do BD.

Obrigado.

#4 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 14/09/2010, 19:21

O seu problema com o strtotime() deve estar acontecendo por causa das configurações regionais do servidor. Tente usar a função setlocale() pra especificar pro PHP que você quer os padrões brasileiros.

http://www.php.net/m...n.setlocale.php

E pegue as datas no formato Y-m-d, pra não ter problema com o MySQL, em vez de d/m/Y.

Sobre o SQL, nele também você vai precisar converter o campo pra poder fazer a comparação. O problema agora é colocar esse varchar em um formato que o MySQL entenda.

http://dev.mysql.com...n/datetime.html

Nesse link tem os formatos de string que ele consegue converter pra DATE. Se você garante que todos os registros no banco estão como dd/mm/aaaa, pra fazer a coisa decentemente, tem que ser algo como (usando YYYYMMDD):

AND CAST(CONCAT(SUBSTRING(ordem.data_agenda, 7, 4),SUBSTRING(ordem.data_agenda, 4, 2),SUBSTRING(ordem.data_agenda, 1, 2)) AS DATE) BETWEEN '$data1' AND '$data2'

Veja que ao optar por manter o campo como varchar você sacrifica a performance. Se a quantidade de registros envolvida for muito grande, a consulta pode pesar um pouco.




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq