Good 4 Denunciar post Postado Novembro 25, 2009 Olha gente... eu fiz um sistema em que o usuário posta um tipo de anúncio, aí na hora de cadastrar o anúncio, ele escolhe em um menu de seleção os dias em que quer que o anúncio fique no AR. De 1 a 31 dias. Aí, por exemplo, um usuário cadastrou um anúncio hoje, com duração de 20 dias. Aí eu queria saber como fazer pra somar a data de hoje (24-11-2009) e os 20 dias (14-12-2009). E assim sucessivamente.. só que eu não consigo fazer com que ele some normalmente, pq o mês irá mudar se ele colocar até o dia 20. Eu tenho um código, só que eu não tinha percebido este problema: $dura = $_POST['duracao']; if($dura == 1){ $duration = "+".$dura." day"; } elseif($dura >= 2){ $duration = "+".$dura." days"; } $duracao = date('d-m-Y', strtotime($duration)); mysql_query("..."); Espero que tenham entendido! Obrigado! Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Novembro 25, 2009 Good, você precisa explicar melhor seu problema, porque a forma que você utilizou está correta para o que eu entendi (é claro que eu não entendi o que você precisa. :P) Compartilhar este post Link para o post Compartilhar em outros sites
Good 4 Denunciar post Postado Novembro 25, 2009 Está correto.. só que deu erro ao usar o script.. pq eu sempre testava o script adicionando apenas um dia.. fazendo com que não alterasse o mês. Aí eu tentei adicionar 20 dias.. o qual iria cair só no próximo mês.. Aí deu um problema no script na mudança de mês ou algo assim.. não mostrou nem um erro ao inserir.. mas eu coloquei pra ser adicionar apenas uns 2 dias.. e adicionou com sucesso.. Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Novembro 25, 2009 Aí eu tentei adicionar 20 dias.. o qual iria cair só no próximo mês.. Veja: date_default_timezone_set( 'America/Sao_Paulo' ); echo date( 'd/m/Y' , strtotime( '+20 days' ) ); //15/12/2009 Talvez, você esteja tendo problemas com a informação que está chegando, tenta assim: date_default_timezone_set( 'America/Sao_Paulo' ); $dura = (int) ( isset( $_POST[ 'dura' ] ) && (int) $_POST[ 'dura' ] > 0 ? $_POST[ 'dura' ] : 1 ); //Se não tiver um POST, assumimos 1 como padrão echo date( 'd/m/Y' , strtotime( sprintf( '+%d day%s' , $dura , $dura > 1 ? 's' : null ) ) ); Compartilhar este post Link para o post Compartilhar em outros sites
Dee 0 Denunciar post Postado Novembro 25, 2009 $data = date("d/m/Y"); $data = explode("/", $data); $somaData = mktime(0,0,0, $data[1], $data[0] + 20, $data[2]); echo strftime("%d/%m/%Y", $somaData); Explicação: Explodi a data, separando o dia, o mês e o ano. Usei a função MkTime(), na qual possui 6 parâmetros: mktime(hora, minuto, segundo, mes, dia, ano); Onde eu coloquei os Zeros, é a hora, que não vem ao caso na sua situação. Ontem tem as variáveis com os indices, é a data explodida. E somei 20 dias a Data Atual. Onde tem o +20 ali. Se você quiser somar ano, hora, minuto, mês é a mesma coisa. E depois eu imprimi a data atualizada usando a função strftime(), para mais informações dessas duas funções, pesquise no manual PHP. =) Compartilhar este post Link para o post Compartilhar em outros sites
Alaerte Gabriel 662 Denunciar post Postado Novembro 25, 2009 Veja umas funções para trabalhar com data amigos: function EntreDatas( $inicio, $fim ){ $aInicio = Explode( "/",$inicio ); $aFim = Explode( "/",$fim ); $nTempo = mktime(0,0,0,$aFim[1],$aFim[0],$aFim[2]); $nTempo1= mktime(0,0,0,$aInicio[1],$aInicio[0],$aInicio[2]); return round(($nTempo-$nTempo1)/86400); } function somadata( $data, $nDias ){ if( !isset( $nDias ) ) $nDias = 7; $aVet = Explode( "/",$data ); //if(($aVet[1] == "01") or ($aVet[1] == "03") or ($aVet[1] == "05") or ($aVet[1] == "07") or ($aVet[1] == "08") or ($aVet[1] == "10") or ($aVet[1] == "12")) // $nDias = $nDias+1; return date( "d/m/Y",mktime(0,0,0,$aVet[1],$aVet[0]+$nDias,$aVet[2])); } function subtraidata( $data, $nDias ){ if( !isset( $nDias ) ) $nDias = 1; $aVet = Explode( "/",$data ); if($aVet[1] == "02" || $aVet[1] == "2") if($nDias > 28) $nDias = 28; if($nDias == 30) if(($aVet[1] == "01") or ($aVet[1] == "03") or ($aVet[1] == "05") or ($aVet[1] == "07") or ($aVet[1] == "08") or ($aVet[1] == "10") or ($aVet[1] == "12")) $nDias = $nDias+1; return date( "d/m/Y",mktime(0,0,0,$aVet[1],$aVet[0]-$nDias,$aVet[2])); } O nome de cada função já diz tudo. Compartilhar este post Link para o post Compartilhar em outros sites
Good 4 Denunciar post Postado Novembro 25, 2009 Ôpa.. vlw ae.. só presta assim... 3 pessoas me ajudaram.. e com algo relacionado a isto.. como é que eu faço para que não seja exibido os anúncios após a data que o usuário escolheu? eu fiz assim na query: mysql_query(... AND duracao <= '".date('d-m-Y')."'); só que fica dando problema.. não fica aparecendo todos os anúncios.. como é que eu poderia selecionar apenas os anúncios aos quais ainda não passaram da data de finalização? acho que não preciso mostrar nada.. pq é só essa parte do AND, etc.. vlw Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Novembro 25, 2009 e com algo relacionado a isto.. como é que eu faço para que não seja exibido os anúncios após a data que o usuário escolheu? select * from suatabela where coluna_da_data between inicio and fim onde inicio é a data inicial e fim a data final, você pode utilizar now() para recuperar a data atual. Compartilhar este post Link para o post Compartilhar em outros sites
Good 4 Denunciar post Postado Novembro 25, 2009 Ah cara.. mas acho que não vai dar certo.. pq as datas não são definidas exatamente.. o usuário pode ir lá e escolher uma data em que o anúncio inicie-se, etc.. um pouco da tabela: CREATE TABLE `anuncios` ( `data` varchar(255) default NULL, `datainicio` varchar(255) default NULL, `duracao` varchar(255) default NULL, ) ENGINE=MyISAM DEFAULT CHARSET=latin1; Explicando os 3 campos.. data: É a data em que o anúncio foi cadastrado! datainicio = É a data em que o usuário escolhe em qual dia irá iniciar o anúncio! duracao = É a data em que o usuário escolhe em qual dia o anúncio irá desaparecer! É só isso ae.. vlw por tentar me ajudar.. Compartilhar este post Link para o post Compartilhar em outros sites
Good 4 Denunciar post Postado Novembro 25, 2009 E ia me esquecendo.. se tiver algo pra modificar na tabela, é só dizer.. vlw Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Novembro 26, 2009 Ah cara.. mas acho que não vai dar certo.. pq as datas não são definidas exatamente.. o usuário pode ir lá e escolher uma data em que o anúncio inicie-se, etc.. Hehehe, vai dar certo sim... um pouco da tabela: CREATE TABLE `anuncios` ( `data` varchar(255) default NULL, `datainicio` varchar(255) default NULL, `duracao` varchar(255) default NULL, ) ENGINE=MyISAM DEFAULT CHARSET=latin1; data: É a data em que o anúncio foi cadastrado! datainicio = É a data em que o usuário escolhe em qual dia irá iniciar o anúncio! duracao = É a data em que o usuário escolhe em qual dia o anúncio irá desaparecer! E ia me esquecendo.. se tiver algo pra modificar na tabela, é só dizer.. Certo, vamos lá... 1. Vamos modificar sua tabela para: create table `datas` ( `id` mediumint(8) unsigned not null auto_increment, `data` timestamp default current_timestamp, `datainicio` date, `duracao` tinyint(2), primary key(`id`) ); O campo data passou a ser TIMESTAMP, como será sempre a data que o usuário cadastrou, o DEFAULT CURRENT_TIMESTAMP facilita o trabalho para você. datainicio passou a ser DATE, o usuário irá informar a data que ele quer iniciar o anúncio exatamente como faz hoje. duracao é agora um TINYINT porque você vai informar um número de dias, então é o mais adequado. Depois de popular essa tabela ficou assim: mysql> select * from `datas`; +----+---------------------+------------+---------+ | id | data | datainicio | duracao | +----+---------------------+------------+---------+ | 1 | 2009-11-26 06:36:45 | 2009-11-24 | 2 | | 2 | 2009-11-26 06:36:45 | 2009-11-20 | 6 | | 3 | 2009-11-26 06:36:45 | 2009-10-26 | 3 | | 4 | 2009-11-26 06:36:45 | 2009-11-06 | 20 | +----+---------------------+------------+---------+ 4 rows in set (0.00 sec) Agora vamos usar a função DATE_ADD do próprio MySQL para fazer a soma da datainicio + duracao: mysql> select date_add( `datainicio` , interval `duracao` day ) from `datas`; +---------------------------------------------------+ | date_add( `datainicio` , interval `duracao` day ) | +---------------------------------------------------+ | 2009-11-26 | | 2009-11-26 | | 2009-10-29 | | 2009-11-26 | +---------------------------------------------------+ 4 rows in set (0.00 sec) Agora vamos ver para hoje, quais anúncios estão entre a datainicio e a datainicio + duracao: mysql> select * from `datas` where date(now()) between `datainicio` and date_add( `datainicio` , interval `duracao` day ); +----+---------------------+------------+---------+ | id | data | datainicio | duracao | +----+---------------------+------------+---------+ | 1 | 2009-11-26 06:36:45 | 2009-11-24 | 2 | | 2 | 2009-11-26 06:36:45 | 2009-11-20 | 6 | | 4 | 2009-11-26 06:36:45 | 2009-11-06 | 20 | +----+---------------------+------------+---------+ 3 rows in set (0.00 sec) Mas a gente não quer ter nem o trabalho de converter a data do MySQL para o padrão brasileiro, então vamos converter diretamente no banco: mysql> select -> d.`id`, -> date_format(d.`datainicio`,'%d/%m/%Y' ) 'datainicio', -> d.`duracao` -> from `datas` d -> where date(now()) between `datainicio` and date_add( `datainicio` , interval `duracao` day ); +----+------------+---------+ | id | datainicio | duracao | +----+------------+---------+ | 1 | 24/11/2009 | 2 | | 2 | 20/11/2009 | 6 | | 4 | 06/11/2009 | 20 | +----+------------+---------+ 3 rows in set (0.00 sec) ;) Compartilhar este post Link para o post Compartilhar em outros sites
Good 4 Denunciar post Postado Novembro 26, 2009 Não entendi nada' Teria como você ou alguém fazer esta query usando normal? tipo mysql_query("SELECT * FROM anuncios WHERE ..."); Desse jeito ae eu num sei nem pra onde vai e o que pegar.. tipo.. eu já coloquei algumas informações da tabela.. aí eu acho que se deve usar o between mesmo.. mas não sei como configurar esta query... queria que me ajudassem nisso.. pq não sei usar este between... vlw Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Novembro 26, 2009 Teria como você ou alguém fazer esta query usando normal? heheh, ai está: $sql = 'select d.`id`,date_format(d.`datainicio`,"%d/%m/%Y" ) "datainicio",d.`duracao` from `datas` d where date(now()) between `datainicio` and date_add( `datainicio` , interval `duracao` day );'; $result = mysql_query( $sql ); Esse fragmento ai irá retornar todos os anúncios em que hoje está entre a data inicial e a data final. ;) Compartilhar este post Link para o post Compartilhar em outros sites
Good 4 Denunciar post Postado Novembro 26, 2009 ------------- EDIÇÃO! Deu certo.. vlw E como eu faço para fazer pra deletar os registros que já passaram do período determinado? Compartilhar este post Link para o post Compartilhar em outros sites
Good 4 Denunciar post Postado Novembro 27, 2009 Acho que agora eu resolvi.. só fiz colocar um NOT... NOT ( date(now()) BETWEEN `datainicio` AND date_add( `datainicio` , interval `duracao` day ) ) Muito fácil, e ninguém disse nada.. ¬¬ mas vlw ae para os que me ajudaram.. obrigado mais uma vez.. Compartilhar este post Link para o post Compartilhar em outros sites