Ir para conteúdo

POWERED BY:

Arquivado

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

Good

[Resolvido] Somar data..

Recommended Posts

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

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

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

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

$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

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

Ô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

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

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

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

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

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

-------------

 

 

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.