Good 4 Denunciar post Postado Dezembro 10, 2009 Bom.. eu fiz um sistema ae de anúncios.. aí eu preciso fazer com que mostre os dias restantes, atualizando a cada dia... eu tentei, mas só dava números negativos.. $total = explode("-",somadata($anuncios['datainicio'],$anuncios['dias_restantes'])); $faltam = ceil((mktime(0,0,0,$total[1],$total[3],$total[0]) - time()) / 86400); A função somadata, só faz somar a data de ínicio e os dias restantes... A data está no formato padrão (Y-m-d)... Resumindo... Eu queria mostrar todo os dias, o total de dias restantes a partir de uma data no banco de dados... CREATE TABLE `anuncios` ( `id` bigint(20) NOT NULL auto_increment, `datainicio` date, `duracao` tinyint(2), `dias_restantes` tinyint(2), ) Explicando a tabela: id - nem precisa explicar datainicio - o nome já diz, é a data em que o anúncio iniciou-se duracao - é formado em dias, para somar com a datainicio. dias_restantes - é o valor que será atualizado todo dia.. E tipo, o usuário que não é o criador do anuncio apenas verá os dias restantes, ele não atualizará nada na tabela. Apenas atualizará, quando o criador entrar no sistema de usuários cadastrados! Obrigado, e espero que esteja bem explicado! Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Dezembro 10, 2009 Bom amigo, a primeira coisa que eu fiz foi modificar sua tabela, veja: mysql> create table `anuncios`( -> `id` mediumint(8) unsigned not null auto_increment, -> `datainicio` date, -> `duracao` tinyint(2), -> primary key(`id`) -> ); Query OK, 0 rows affected (0.05 sec) Removi o campo dias_restantes que será uma coluna dinâmica que calcularemos. Feito isso, adicionei alguns registros para teste: mysql> select * from `anuncios`; +----+------------+---------+ | id | datainicio | duracao | +----+------------+---------+ | 1 | 2009-11-30 | 20 | | 2 | 2009-12-01 | 10 | | 3 | 2009-12-10 | 5 | +----+------------+---------+ 3 rows in set (0.00 sec) Bom, o primeiro passo é somar a datainicio com a duracao para sabermos a data final: mysql> select `datainicio`, `datainicio` + interval `duracao` day 'datafinal' from `anuncios`; +------------+------------+ | datainicio | datafinal | +------------+------------+ | 2009-11-30 | 2009-12-20 | | 2009-12-01 | 2009-12-11 | | 2009-12-10 | 2009-12-15 | +------------+------------+ 3 rows in set (0.00 sec) Com a data final já calculada, vamos ver quantos dias restam: mysql> select -> `datainicio`, `datainicio` + interval `duracao` day 'datafinal',date( now() ) 'hoje', -> datediff( `datainicio` + interval `duracao` day , date( now() ) ) 'dias_restantes' -> from `anuncios`; +------------+------------+------------+----------------+ | datainicio | datafinal | hoje | dias_restantes | +------------+------------+------------+----------------+ | 2009-11-30 | 2009-12-20 | 2009-12-10 | 10 | | 2009-12-01 | 2009-12-11 | 2009-12-10 | 1 | | 2009-12-10 | 2009-12-15 | 2009-12-10 | 5 | +------------+------------+------------+----------------+ 3 rows in set (0.00 sec) A consulta final ficou: select `datainicio`, `datainicio` + interval `duracao` day 'datafinal', date( now() ) 'hoje', datediff( `datainicio` + interval `duracao` day , date( now() ) ) 'dias_restantes' from `anuncios`; ;) Compartilhar este post Link para o post Compartilhar em outros sites
Matias Rezende 50 Denunciar post Postado Dezembro 10, 2009 Tópico Movido PHP http://forum.imasters.com.br/public/style_emoticons/default/seta.gif MySQL Compartilhar este post Link para o post Compartilhar em outros sites
Good 4 Denunciar post Postado Dezembro 10, 2009 E como eu faria pra dar um echo nisso ae? Num sei nem como começa.. vlw Compartilhar este post Link para o post Compartilhar em outros sites
quintelab 91 Denunciar post Postado Dezembro 10, 2009 Sua dúvida este em como fazer a query? O tópico continuara aqui. Ou como exibir os dados em PHP? Ae irei voltar o tópico para PHP. Abraços... Compartilhar este post Link para o post Compartilhar em outros sites
Good 4 Denunciar post Postado Dezembro 10, 2009 Exibir os dados em PHP Compartilhar este post Link para o post Compartilhar em outros sites
quintelab 91 Denunciar post Postado Dezembro 10, 2009 Movido MySQL http://forum.imasters.com.br/public/style_emoticons/default/seta.gif PHP Irei mover o tópico de volta, mas se tiver dúvidas sobre sua query crie um tópico em MySql e não em PHP. Abraços... Compartilhar este post Link para o post Compartilhar em outros sites
Good 4 Denunciar post Postado Dezembro 10, 2009 Bom.. eu fiz um sistema ae de anúncios.. aí eu preciso fazer com que mostre os dias restantes, atualizando a cada dia... eu tentei, mas só dava números negativos.. $total = explode("-",somadata($anuncios['datainicio'],$anuncios['dias_restantes'])); $faltam = ceil((mktime(0,0,0,$total[1],$total[3],$total[0]) - time()) / 86400); A função somadata, só faz somar a data de ínicio e os dias restantes... A data está no formato padrão (Y-m-d)... Resumindo... Eu queria mostrar todo os dias, o total de dias restantes a partir de uma data no banco de dados... Essa parte toda ae eu me referia a PHP! Compartilhar este post Link para o post Compartilhar em outros sites
Matias Rezende 50 Denunciar post Postado Dezembro 10, 2009 Certo. Tentou fazer como o João Batista falou? Depois daquele código, faça a exibição normal da consulta, utilizando mysql_fetch_assoc. Qualquer dúvida, poste novamente Carlos Eduardo Compartilhar este post Link para o post Compartilhar em outros sites
Good 4 Denunciar post Postado Dezembro 10, 2009 AEEEE!!! Eu consegui! Pelo menos mostrous os resultados, mas esta maneira está correta? Fiz em PHP! Ficou meio grande, mas funcionou.. :D function dias_restantes($DataInicial, $DataFinal) { $DataI = explode("-", $DataInicial); $DataF = explode("-", $DataFinal); $DataInicial2 = mktime(0, 0, 0, $DataI[1], $DataI[0], $DataI[2]); $DataFinal2 = mktime(0, 0, 0, $DataF[1], $DataF[0], $DataF[2]); return ($DataInicial2 > $DataFinal2) ? floor(($DataInicial2 - $DataFinal2)/84600) : floor(($DataFinal2 - $DataInicial2)/84600); } $da = explode("-",$casting['datainicio']); $dat = "$da[2]-$da[1]-$da[0]"; $data = explode("-", $dat); $somaData = mktime(0,0,0, $data[1], $data[0] + $casting['duracao'] - 1, $data[2]); $soma = strftime("%d-%m-%Y", $somaData); if(dias_restantes($dat, $soma) == 0){ $finaliza = "hoje"; } else { $finaliza = "em ".dias_restantes($dat, $soma)." dia(s)"; } echo $finaliza; Vlw ae pela tentativa.. vou ficar com esse mesmo.. mas se quiserem postar o outro método pra ajudar alguém.. obrigado! VLW!! Compartilhar este post Link para o post Compartilhar em outros sites
giesta 29 Denunciar post Postado Dezembro 10, 2009 Mas que bacalhoada dos infernos hein... Select id, datediff(datainicio + INTERVAL duracao DAY, date(now()) dias_restantes from tabela Compartilhar este post Link para o post Compartilhar em outros sites
Good 4 Denunciar post Postado Dezembro 10, 2009 beleza.. to pensando em usar esse sql, que é menos coisa e eu acho que o meu não vai dar certo.. eu queria q vcs verificassem sem vai dar certo o meu feito em php.. e o de vcs fica dando erro na consulta.. João Batista: Finaliza 2009-12-23 Giesta: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'dias_restantes FROM casting WHERE date(now()) BETWEEN `datainicio` AND date_add(' at line 1 JOÃO: E como eu faço pra consultar? Eu fiz usando array: $anuncio = mysql_fetch_array($anuncios); $anuncio[1]; Compartilhar este post Link para o post Compartilhar em outros sites
Good 4 Denunciar post Postado Dezembro 10, 2009 Resolvido.. código final: function dias_restantes($datainicio, $duracao) { $da = explode("-",$datainicio); $dat = "$da[2]-$da[1]-$da[0]"; $data = explode("-", $dat); ///////////////////// $data_inicial = $datainicio; $data_final = date("Y-m-d"); $time_inicial = strtotime($data_inicial); $time_final = strtotime($data_final); $diferenca = $time_final - $time_inicial; // 19522800 segundos $dias = (int)floor( $diferenca / (60 * 60 * 24)); // 225 dias ///////////////////// $somaData = mktime(0,0,0, $data[1], $data[0] + $duracao - $dias, $data[2]); $soma = strftime("%d-%m-%Y", $somaData); $DataInicial = $dat; $DataFinal = $soma; $DataI = explode("-", $DataInicial); $DataF = explode("-", $DataFinal); $DataInicial2 = mktime(0, 0, 0, $DataI[1], $DataI[0], $DataI[2]); $DataFinal2 = mktime(0, 0, 0, $DataF[1], $DataF[0], $DataF[2]); $resultado = ($DataInicial2 > $DataFinal2) ? floor(($DataInicial2 - $DataFinal2)/84600) : floor(($DataFinal2 - $DataInicial2)/84600); if($resultado == 0){ $finaliza = "hoje"; } else { $finaliza = "em $resultado dia(s)"; } return $finaliza; } Se alguém quiser pegar pra melhor ainda mais o código.. está aí pra quem quiser.. flw obrigado a vcs! Acho que esse deu certo.. :P se não der, eu venho aqui amanhã.. :D Compartilhar este post Link para o post Compartilhar em outros sites