Jump to content


Photo

X Dias


  • Faça o login para participar
9 replies to this topic

#1 lifeofgames

lifeofgames

    Ativo

  • Usuários
  • 325 posts
  • Sexo:Masculino
  • Localidade:Minas Gerais

Posted 23/02/2006, 08:34

Como faço pra fazer mostrar dos dados cadastrados no bd faltando x dias.
EX: tenho uma data cadastrada como dd/mm/yyyy.
e gostaria de fazer uma pagina q mostrasse que ia vencer o cadastro dentro d x dias.
EX:

faltam 90 dias

faltam 10 dias

faltam 9 dias

faltam 8 dias etc....

como fazer?
Aprendendo a Amar - O Encanto é aqui!
www.aprendendoaamar.com

#2 Stormbringer

Stormbringer

    I'd love to stay with you all

  • Ex-Admins
  • 2927 posts
  • Sexo:Não informado
  • Localidade:Goiânia - GO
  • Interesses:Atualmente: pesquisa e desenvolvimento de web-games

Posted 23/02/2006, 08:42

bom, primeiramente a data esta cadastrada de uma maneira pouco manipulável, mas dá pra fazer mesmo assim...
vc já rabiscou algo no papel que possa te ajudar a resolver o problema? conte tudo o que vc imaginou pra isso até agora pra gente te ajudar com base no que vc já mentalizou ;)

๑۩۞۩๑Let the Carnage Begin!!๑۩۞۩๑


#3 lifeofgames

lifeofgames

    Ativo

  • Usuários
  • 325 posts
  • Sexo:Masculino
  • Localidade:Minas Gerais

Posted 23/02/2006, 08:44

Tentei converter a data pra segundos e diminuir pelo numero de dias.[
Mas deu certo nao, se for mais facil me de um toque usando campos separado para d m y mesmo
Aprendendo a Amar - O Encanto é aqui!
www.aprendendoaamar.com

#4 Felipe Pena

Felipe Pena

    O temor do Senhor é o princípio da sabedoria

  • Ex-Admins
  • 6441 posts
  • Sexo:Masculino

Posted 23/02/2006, 12:06

Se quiser fazer na própria query todo o trabalho, transforme a data para o formato BR com: LEFT(), RIGHT e SUBSTRING().
E adicione X datas a data formatada com DATE_ADD() e compare com a data da tabela na claúsula WHERE.

Obs.: Já mostrei esse processo aqui no fórum.
Felipe Pena
[...] ó terra, terra, terra; ouve a palavra do Senhor. — Jeremias 22:29

#5 lifeofgames

lifeofgames

    Ativo

  • Usuários
  • 325 posts
  • Sexo:Masculino
  • Localidade:Minas Gerais

Posted 23/02/2006, 15:54

Se quiser fazer na própria query todo o trabalho, transforme a data para o formato BR com: LEFT(), RIGHT e SUBSTRING().
E adicione X datas a data formatada com DATE_ADD() e compare com a data da tabela na claúsula WHERE.

Obs.: Já mostrei esse processo aqui no fórum.

me chinga nao huahuea
seja mais especifico
Aprendendo a Amar - O Encanto é aqui!
www.aprendendoaamar.com

#6 Rodrigo

Rodrigo

    oi!

  • Usuários
  • 995 posts
  • Sexo:Não informado
  • Interesses:Diretório de sites - http://www.acheinobrasil.com.br

Posted 23/02/2006, 17:08

tenho 2 funções que eu acho que lhe servirão ;)

// Funções que convertem as Datas e Horas para o DB e para a Página
function DataParaDB($data)
        {
         list($dia,$mes,$ano)=explode("/",$data);
         if (strlen($dia)==1)
            $dia="0$dia";
         if (strlen($mes)==1)
            $mes="0$mes";
         $datadb = "$ano$mes$dia";
         return $datadb;
        }
function DataDoDB($data)
        {
         if (strlen($data)!=0)
            {
             $dia = substr($data,6,2);
             $mes = substr($data,4,2);
             $ano = substr($data,0,4);
             $datadb = "$dia/$mes/$ano";
             return $datadb;
            }
        }

// Função que retorna o intervalo entre datas (em dias)
function conta_dias($data_de,$data_a)
        {
         if ($data_de)
            {
             if (!strstr($data_de,"/"))
                 $data_de=DataDoDB($data_de);
            } else {
             $data_de=date("d/m/Y");
            }

         if ($data_a)
            {
             if (!strstr($data_a,"/"))
                 $data_a=DataDoDB($data_a);
            } else {
             $data_a=date("d/m/Y");
            }

         list($dia_de,$mes_de,$ano_de) = explode("/",$data_de);
         list($dia_a,$mes_a,$ano_a) = explode("/",$data_a);

         $timestamp1=mktime (0, 0, 0, $mes_de, $dia_de, $ano_de);
         $timestamp2=mktime (0, 0, 0, $mes_a, $dia_a, $ano_a);
         
         return number_format((($timestamp1-$timestamp2)/86400),0);
        }

// Função que retorna a data futura (dd/mm/aaaa)
function acha_data($data,$dias)
        {
         if ($data)
            {
             if (!strstr($data,"/"))
                 $data=DataDoDB($data);
            } else {
             $data=date("d/m/Y");
            }

         list($dia,$mes,$ano) = explode("/",$data);

         $timestamp  = mktime(0, 0, 0, $mes, $dia+$dias, $ano);

         return date("d/m/Y",$timestamp);
        }

Edição feita por: Rodrigo, 23/02/2006, 17:09.


#7 xleandro

xleandro

    Saber eh poder

  • Usuários
  • 359 posts
  • Sexo:Não informado
  • Localidade:ES
  • Interesses:Linguagens de programaçao, SO`s, hardwares e softwares.

Posted 23/02/2006, 17:34

Eh o mesmo eskema como se vc fosse ver os dias q faltam pro aniversario da pessoa né?
Eu trabalho com Oracle, fiz uma procedure em pl/sql para ver os dias q faltam pro aniversario da pessoa hj...

PROCEDURE RETORNA_DIA_ANIVERSARIO (RDIAS    IN OUT DIA_C) IS
BEGIN
OPEN RDIAS FOR
SELECT TO_CHAR(DT_ANIVERSARIO, 'DD') - TO_CHAR(SYSDATE, 'DD')
FROM TB_PESSOAS
WHERE TO_CHAR(DT_ANIVERSARIO, 'MM/YYYY') = TO_CHAR(SYSDATE, 'MM/YYYY')
  AND TO_CHAR(DT_ANIVERSARIO, 'DD')     >= TO_CHAR(SYSDATE, 'DD');
END RETORNA_DIA_ANIVERSARIO;


Vc pode pegar a ideia da procedure e adequar para o banco q vc usa...

No caso ai eu peguei soh do mês... mas vc pode adequar ai tb ateh qto tempo antes vc precisa e talz
Nesta guerra jah conquistamos grandes e pequenas batalhas, desde as mais faceis ateh akelas que para qualquer outro mortal seria dita como inalcansavel, mas então, pq continuar? Simples...
Pq o mais importante não eh vencer todas as batalhas, mas sim perpetuar a guerra. ;o)

Meu fotolog: http://www.pixlog.net/xleandro
Leandro Pretti

#8 Felipe Pena

Felipe Pena

    O temor do Senhor é o princípio da sabedoria

  • Ex-Admins
  • 6441 posts
  • Sexo:Masculino

Posted 23/02/2006, 19:18

xleandro, a data na tabela dele não está no formato inglês.

Transformar a data do BD do formato português para inglês:
CONCAT(RIGHT(data, 4), '-', SUBSTRING(data, 4, 2), '-', LEFT(data, 2))

Obs.: Aonde aparece a palavra `data` nos exemplos que serão dados, está se referindo ao campo que contém a data na tabela.

O que foi feito acima? Foi pego cada parte constituinte de uma data (dia, mês e ano) e concatenado entre hífens (-).

Tendo assim, uma data no formato inglês, poderemos trabalhar no MySQL com as funções detinadas ao trabalho com DATA/HORA.

Bom, o que precisamos fazer agora é adicionar uma certa quantidade de dias as datas cadastradas na tabela e verifica se batem com o dia atual.

Exemplo:
Se hojé é 2006-02-23, e na tabela temos um data cadastrada no dia 2006-02-20, e no nosso sistema o limite de uso é de 3 dias, basta nós somarmos 3 dias a data cadastrada que veremos que baterá com a data de hoje, tendo assim encerrado a partir de hoje.

Pois bem, como adicionar X data(s) a data da tabela para fazer a verificação?
Simples, no MySQL encontramos a seguinte função:

ADDDATE(data,INTERVAL expr type)
ADDDATE(expr,dias)


Tendo a segunda sintaxe disponível somente para versão a partir de 4.1
Sem problemas, vamos trabalhar com a primeira!

ADDDATE(DATA, INTERVAL 10 DAY)


Aonde DATA é a data que foi formatada, a que está no formato inglês.
Fazendo a substituição fica:
ADDDATE(CONCAT(RIGHT(data, 4), '-', SUBSTRING(data, 4, 2), '-', LEFT(data, 2)), INTERVAL 10 DAY)

Agora precisamos fazer a comparação com a data atual!
ADDDATE(CONCAT(RIGHT(data, 4), '-', SUBSTRING(data, 4, 2), '-', LEFT(data, 2)), INTERVAL 10 DAY) = CURDATE()

Assim obteremos as datas que fazem exatamente 10 dias que estão cadastradas, em relação ao dia corrente.

Lembre-se que a expressão acima é para ser usada na cláusula WHERE.

Com uma bela (nível médio de complexidade) query você consegue fazer todo esse trabalho de pegar as que completam 90 dias e dias menores também, agrupando e selecionando conforme o grupo de dias corridos.

Procure conhecer as cláusulas GROUP BY e HAVING.
Felipe Pena
[...] ó terra, terra, terra; ouve a palavra do Senhor. — Jeremias 22:29

#9 xleandro

xleandro

    Saber eh poder

  • Usuários
  • 359 posts
  • Sexo:Não informado
  • Localidade:ES
  • Interesses:Linguagens de programaçao, SO`s, hardwares e softwares.

Posted 24/02/2006, 10:50

lifeofgames: Qual banco vc ta usando? MySQL?
Nesta guerra jah conquistamos grandes e pequenas batalhas, desde as mais faceis ateh akelas que para qualquer outro mortal seria dita como inalcansavel, mas então, pq continuar? Simples...
Pq o mais importante não eh vencer todas as batalhas, mas sim perpetuar a guerra. ;o)

Meu fotolog: http://www.pixlog.net/xleandro
Leandro Pretti

#10 lifeofgames

lifeofgames

    Ativo

  • Usuários
  • 325 posts
  • Sexo:Masculino
  • Localidade:Minas Gerais

Posted 24/02/2006, 11:11

Correto, Mysql
Aprendendo a Amar - O Encanto é aqui!
www.aprendendoaamar.com




0 user(s) are reading this topic

0 membro(s), 0 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq