Ir para conteúdo

Arquivado

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

João Paulo Hildebrand

Função time() PHP

Recommended Posts

Galera, bom dia!
Tenho um form que ao usuário digitar a data de início e data fim (01-07-2014 e 02-07-2014) de uma busca o sistema converte para time():

 

$dataInicio = strtotime($_POST['data']." 00:00:00");

$dataFim = strtotime($_POST['dataFim']." 23:59:59");

 

Era para ser feito uma busca no banco de dados as datas que estiverem entre as datas que o usuário informou. Exemplo:

 

<?php

$dataInicio = strtotime("01-07-2014"." 23:59:59");
$dataFim = strtotime("02-07-2014"." 23:59:59");
echo $dataInicio;
// Será mostrado 1404259199
echo $dataFim;
// Será mostrado 1404345599
?>

 

A minha busca é basicamente essa:

 

WHERE dataSolicitacao BETWEEN '$dataInicio' AND '$dataFim' ORDER BY idSolicitacao ASC

 

Então, o sistema buscará as datas que estiverem entre esses dois números. Super simples assim.
O problema é que, até o mês passado (Junho/2014) ele estava funcionando PERFEITAMENTE! Agora, virou o mês e não está mais buscando os registros...
Alguém se habilita? rsrs
Obrigado!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, ainda não rolou... Fiz algumas alterações, e de acordo com a clausula BETWEEN era para funcionar normalmente...

Olha o código:

<?php
		
		$dataInicio = "02-07-2014 00:00:01";
		$dataInicio = explode("-", $dataInicio);
		$diaInicio  = $dataInicio[0];
		switch($dataInicio[1]){
			case "01": $mesInicio = "January"; break;
			case "02": $mesInicio = "February"; break;
			case "03": $mesInicio = "March"; break;
			case "04": $mesInicio = "April"; break;
			case "05": $mesInicio = "May"; break;
			case "06": $mesInicio = "June"; break;
			case "07": $mesInicio = "July"; break;
			case "08": $mesInicio = "August"; break;
			case "09": $mesInicio = "September"; break;
			case "10": $mesInicio = "October"; break;
			case "11": $mesInicio = "November"; break;
			case "12": $mesInicio = "December"; break;
		};
		$anoInicio = $dataInicio[2];
		$dataInicio = $diaInicio." ".$mesInicio." ".$anoInicio;


		$dataFim = "05-07-2014 23:59:59";
		$dataFim = explode("-", $dataFim);
		$diaFim  = $dataFim[0];
		switch($dataFim[1]){
			case "01": $mesFim = "January"; break;
			case "02": $mesFim = "February"; break;
			case "03": $mesFim = "March"; break;
			case "04": $mesFim = "April"; break;
			case "05": $mesFim = "May"; break;
			case "06": $mesFim = "June"; break;
			case "07": $mesFim = "July"; break;
			case "08": $mesFim = "August"; break;
			case "09": $mesFim = "September"; break;
			case "10": $mesFim = "October"; break;
			case "11": $mesFim = "November"; break;
			case "12": $mesFim = "December"; break;
		};
		$anoFim = $dataFim[2];
		$dataFim = $diaFim." ".$mesFim." ".$anoFim;
		
		echo $dataInicio . " = " . strtotime($dataInicio);
		echo "<br>";
		echo "No meu banco tem um cadastro nessa data -> 1404312050";
		echo "<br>";
		echo $dataFim . " = " . strtotime($dataFim);
?>

No meu banco tem um registro com a data(valor/numero) 1404312050 e ainda assim não me retorna registro nenhum...

 

O código acima visto no browser é:

02 July 2014 00:00:01 = 1404259201
No meu banco tem um cadastro nessa data -> 1404312050
05 July 2014 23:59:59 = 1404604799

Pode me ajudar? Valeeeu!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se sua data está como timestamp no banco, use a fução mktime() do php ou a classe dateTime()

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

http://www.php.net/manual/pt_BR/function.mktime.php

 

strtotime() serve para converter um texto em inglês em um timestamp, logo se você não está recebendo uma data em inglês não me parece ter um motivo para usar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Playerbr,

 

Estou tratando tudo como uma string comum. No banco está gravado como varchar. Pelo que entendi, o BETWEEN aceita pegar valores que estão entre um e outro número, não necessariamente sendo datas.

 

Testei o exemplo acima, e ele imprimiu para mim perfeitamente os números 1404259201 e 1404604799. E no meu banco existe um registro com o valor 1404312050. Ou seja, o que está no meu banco está sim entre os dois valores da condição.

 

Desculpe insistir na minha teoria, mas gostaria de ter uma ideia mais clara da coisa...

 

Obrigado!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Criei uma tabela com os seus três registros e executei a sql direto pelo php myadmin, funcionou.

O campo no mysql está como int e os valores foram passados sem as aspas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ponto 1:

 

Use no seu banco de dados os tipos corretos de dados para o que você quer tratar.

Se é um campo de data, use o tipo date.

Se é um campo numerico, utilize um formato que comporte o valor esperado (int, bigint, float, etc).

Se é um campo data/hora, use datetime.

Utilizar varchar para gravar tudo quanto é coisa, sempre vai gerar dor de cabeça, como a que você está tendo agora. O banco de dados não vai conseguir comparar os valores de data em um formato texto como você está fazendo.

 

Ponto 2:

 

Dê uma estudada na classe DateTime do PHP. Muito mais eficaz para fazer o que você quer:

$dataDoFormulario = '01-07-2014'; // (dia, mes,ano)
$date = DateTime::createFromFormat('d-m-Y', $dataDoFormulario);
echo $date->format('d/m/Y');

Até depois para comparar as datas no PHP fica mais fácil com ela

$janeiro = new DateTime('2015-01-01');
$hoje = new DateTime();

if($hoje > $janeiro) {
  echo 'Já passamos de janeiro de 2015';
} else {
  echo 'Ainda não chegamos em janeiro';
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha só o que eu fiz e ainda assim não estou conseguindo..

 

No meu banco eu tenho os registros:

id	nome	   data
1	João	   2014-07-04 10:38:34.000
5	João	   2014-07-04 10:43:21.613
6	asd	   2014-07-04 10:43:26.613
7	asdas	   2014-07-04 10:43:45.613
8	asdas	   2014-07-04 10:44:27.000
9	sadsada	   2014-07-04 10:44:51.000
10	sasad	   2014-07-01 11:03:24.000

Na minha consulta....

<?php
$dataInicio = "2014-07-01 00:00:00";
$dataFim    = "2014-07-05 00:00:00";

echo odbc_num_rows(odbc_exec($conexao, "SELECT * FROM dbo.registros WHERE data BETWEEN '$dataInicio' AND '$dataFim'"));
?>

Vejam que tenho no banco a menor data: 2014-07-01 11:03:24.000 e a maior 2014-07-04 10:38:34.000. E ainda assim ele me devolve 0 resultados...

 

 

Obs: O coluna data está configurada como datetime e eu registrei como date("01/m/Y H:i:s")

 

 

 

Podem me ajudar?

Obrigado a todos!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Que tipo de banco de dados (Mysql, access, postgree, etc)?

O nome do banco é dbo mesmo?

O que você quis dizer com

 

 

Obs: O coluna data está configurada como datetime e eu registrei como date("01/m/Y H:i:s")

No banco de dados você configurou a coluna como datetime?

Outras consultas usando maior ou igual retornam registros?

O print da $sql retorna uma sql válida?

Essa sql roda em outro programa de gerenciamento tipo "phpmyadmin"

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.