Ir para conteúdo

POWERED BY:

Arquivado

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

E.Martins

Como criar função dias para vencer contrato

Recommended Posts

Estou com um problema para criar uma função para que puxe do banco de dados a data e compare com a data atual exibindo quantos dias falta para o vencimento do contrato, caso alguém tenha ideia do que estou falando da uma ajudinha ai. :D

 

Segue o código que já to trabalhando:

<?php
include './connect/db_connect.php';
$connect = new mysqli($servername, $username, $password, $dbname) or die(mysqli_error());

$sql = mysqli_query($connect, "SELECT `ord`, `descricao`, `assintatura`, `vencimento` FROM `licitacao`");	
	
	if(mysqli_num_rows($sql)>0) {
         echo "<table>"; //Criamos a tabela
         //Aqui criamos o cabeçalho da tabela.
         // A tag <tr> abre uma linha, enquanto a <td> abre uma célula.
         echo "<tr>"
	      ."<td class='center top_table'>Ordem</td>"
              ."<td class='center top_table'>Descrição</td>"
              ."<td class='center top_table'>Assinatura</td>"
              ."<td class='center top_table'>Vencimento</td>"
              ."<td class='status top_table'>Estatus</td>"
              ."</tr>"; // Fechamos o cabeçalho.
	}
	
	while($exibe=mysqli_fetch_array($sql)) {
		$id = $exibe['ord'];
		//Não exibi todos os dados, agora é só você completar, colocando cada célula dentro de um <td>
		echo "<tr>"
		    ."<td class='center'>$exibe[ord]</td>"
		    ."<td class='left'>$exibe[descricao]</td>"
		    ."<td class='center'>$exibe[assintatura]</td>"
		    ."<td class='center'>$exibe[vencimento]</td>"
		    ."<td class='center'></td>"
                    ."</tr>";
	}
	        // E fora do while fechamos a tabela.
	        echo "</table>";
?>

Aguardo!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Transforme a data num timestamp. Pode utilizar mktime() ou strtotime() para isso. Vou dar um exemplo usando o mktime():

 

OBS: Você precisa saber que o timestamp é o tempo calculado em segundos desde a era Unix. Sendo assim, um dia e igual a segundos x minutos x horas => 60*60*24 = 1 dia = 86400 segundos.

<?php
// Calcule o timestamp da hora que você capturou do banco de dados no formato abaixo:
$hora = 0;
$minuto = 0;
$segundo = 0;
$mes = 6;
$dia = 20;
$ano = 2015;
$total = mktime($hora,$minuto,$segundo,$mes,$dia,$ano);

// Diminua o tempo TOTAL pelo tempo ATUAL e obterá o resultado de dias que restam até a data final:
$restam = $total - time();

// Divida o resultado em segundos pr 86400 e obterá o resultado em dias restantes:
$restam = $restam / 86400;

echo "Restam: ".$restam." dia(s) para o vencimento do boleto";

// Poderia, inclusive, ter feito tudo direto:
echo "<hr>";
$restam = ((mktime($hora,$minuto,$segundo,$mes,$dia,$ano) - time()) / 86400);
echo "Restam: ".$restam." dia(s) para o vencimento do boleto";
?>

Se fosse usar o strtotime seria assim:

OBS: Nesse exemplo eu vou usar o round() pra arredondar o tempo e tornar mais amigável pro cliente.

<?php
// Calcule o timestamp da hora que você capturou do banco de dados no formato abaixo:
$restam = ((strtotime("20-06-2015") - time()) / 86400);
echo "Restam: cerca de ".round($restam)." dia(s) para o vencimento do boleto";
// No caso do strtotime a data tem que OBRIGATORIAMENTE ser no formato dd-mm-AAAA
?>

Simples assim :)


A diferença entre mktime() e strtotime() é que com o mktime() você pode editar a hora, minuto e segundo que vai usar pra calcular o tempo. Já no mktime vai sempre retornar a meia noite do dia escolhido.


Com isso facilmente você cria uma função.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado Diego, mais na realidade estou tentando puxar a data final do banco mysql e não sei como usar ela para obter a data do vencimento.

 

Esse é meu problema no banco estou puxando a data assim:

$sql = mysqli_query($connect, "SELECT `ord`, `descricao`, `assintatura`, `vencimento` FROM `licitacao`");

esse vencimento ai quero puxar ele no mktime() ou no strtotime(), mais já quebrei a cabeça e não consigo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz umas modificações no código mais ainda esta dando errado por que o formato do banco vem 20/02/2015, mais o PHP não reconhece e transforma em formato 02/20/2015 ai da um erro na exibição do vencimento do contrato.

 

Segue código PHP:

<?php
date_default_timezone_set('America/Recife'); // Hora oficial do Brasil.

include './connect/db_connect.php';
$connect = new mysqli($servername, $username, $password, $dbname) or die(mysqli_error());

$sql = mysqli_query($connect, "SELECT `ord`, `mod_num`, `cont_num`, `vencedor`, `assintatura`, `vencimento` FROM `licitacao`");

	if(mysqli_num_rows($sql)>0) {
         echo "<table>"; //Criamos a tabela
         //Aqui criamos o cabeçalho da tabela.
         // A tag <tr> abre uma linha, enquanto a <td> abre uma célula.
         echo "<tr>"		      
	     ."<td class='center top_table'>Nº</td>"
	     ."<td class='center top_table'>Modalidade e Número</td>"
	     ."<td class='center top_table'>Nº do Contrato</td>"
	     ."<td class='center top_table'>Nome do Fornecedor</td>"
             ."<td class='center top_table'>Assinatura</td>"
             ."<td class='center top_table'>Vencimento</td>"
             ."<td class='status top_table'>Restam</td>"
             ."</tr>"; // Fechamos o cabeçalho.
	}	
	
	while($exibe=mysqli_fetch_array($sql)) {
		$id = $exibe['ord'];
		
		$now = time(); // Salva o timestamp atual numa variável		
		$datestr = strtotime('vencimento');
		
		$remaining = $datestr - $now;
		$dias = $remaining / (24*60*60);
		
		$remaining -= ((int) $dias * (24*60*60));
		
		//Não exibi todos os dados, agora é só você completar, colocando cada célula dentro de um <td>
		echo "<tr>"
		    ."<td class='center'>$exibe[ord]</td>"
		    ."<td class='left'>$exibe[mod_num]</td>"
		    ."<td class='left'>$exibe[cont_num]</td>"
		    ."<td class='left'>$exibe[vencedor]</td>"
		    ."<td class='center'>$exibe[assintatura]</td>"
		    ."<td class='center'>$exibe[vencimento]</td>"
		    ."<td class='left'>" . (int) $dias . " dia(s) para o vencimento.</td>"
            ."</tr>";
	}
	// E fora do while fechamos a tabela.
	    echo "</table>";		
	
?>

O timeleft esta sendo exibida assim "-16601 dia(s) para o vencimento.", um valor negativo exatamente pelo que citei acima. :assobiando:

Compartilhar este post


Link para o post
Compartilhar em outros sites

O correto seria utilizar um campo adequado para datas no BD, pelo visto está sendo usado um varchar... ai você tem duas alternativas, converter esta data que você do BD para o formado yyyy-mm-dd como explode/implode, ou dar uma olhada no manual, pois lá tem outras pessoas que passaram pela mesma situação que você.

Compartilhar este post


Link para o post
Compartilhar em outros sites

E.Martins você pode utilizar somente o MySQL para efetuar este calculo.

 

A sentença está assim:

SELECT `ord`, `mod_num`, `cont_num`, `vencedor`, `assintatura`, `vencimento` FROM `licitacao`

Mude para:

SELECT `ord`, `mod_num`, `cont_num`, `vencedor`, `assintatura`, `vencimento`, DATEDIFF(vencimento, CURDATE()) diasvencimento FROM `licitacao`

Claro, isto funcionará caso o campo "vencimento" esteja como campo data.

 

Qualquer dúvida é só chamar.

 

Atenciosamente,

Vitor M. Braga.

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.