-rafael- 1 Denunciar post Postado Agosto 20, 2010 ola a todos, como faço para fazer o calculo de um periodo de tempo, acrescentando periodos? ex: tenho no meu banco, o campo anos, meses e dias fazendo um select sum(anos), sum(meses), sum(dias), tenho o seguinte 4, 9 , 3 4 anos, 9 meses, 5 dias. agora gostaria de acrescentar 5 meses, ai ficaria 4, 14 , 3 4 anos, 14 meses, 5 dias. mas esperaria 5 anos 2 meses, 5 dias. existe alguma forma para resolver isso? obrigado. Compartilhar este post Link para o post Compartilhar em outros sites
André D. Molin 15 Denunciar post Postado Agosto 20, 2010 A função mktime() pode te ajudar. Compartilhar este post Link para o post Compartilhar em outros sites
-rafael- 1 Denunciar post Postado Agosto 20, 2010 ola, obrigado pela ajuda, mas a função mktime gera o timestamp, e eu nao tenho data para comparar. o que tenho é valores absolutos de anos meses e dias(em colunas q são somadas com o sum da consulta), e tenho q transforma-los em um período correto 4 anos, 14 meses, 5 dias não esta correto. os valores estao armazenados em campos int no banco (mysql) se for isso mesmo q você tentou me dizer, eu nao sei como usar o mktime para acertar essa situação. Compartilhar este post Link para o post Compartilhar em outros sites
EuToComProblema! 1 Denunciar post Postado Agosto 20, 2010 na minha opinião você tem duas opções. passa esses 3 campos para uma string depois converte a string para data e faz os cálculos necessários. essa eu acho a melhor coisa a se fazer. ou ainda você cria uma função para arrumar isso. E nela você divide os meses por 12, se sobrar alguma coisa divide de novo até não sobrar mais nada, cada vez que sobrar algo acrescenta 1 no ano, e faz o mesmo para os dias em relação aos meses Compartilhar este post Link para o post Compartilhar em outros sites
-rafael- 1 Denunciar post Postado Agosto 20, 2010 mas o que eu tenho não é uma data, mas sim um prazo. o banco me retorna 4 anos, 14 meses, 5 dias, ou seja, ele soma todos os campos anos, todos os campos meses, e todos os campos dias, e chega neste valor. O que eu quero é transformar este valor em um período de tempo logico, ou seja neste caso em 5 anos 2 meses, 5 dias. obrigado. Compartilhar este post Link para o post Compartilhar em outros sites
André D. Molin 15 Denunciar post Postado Agosto 20, 2010 Para começar, a modelagem do seu banco de dados não é a "mais indicada" para o que está fazendo. Se você vai trabalhar com datas, utilize sempre os tipos DATE ou DATETIME. Compartilhar este post Link para o post Compartilhar em outros sites
-rafael- 1 Denunciar post Postado Agosto 20, 2010 colega, ja disse acima que isso não é data, e sim prazo. no meu banco, os campos que são data, estão armazenados como data. Compartilhar este post Link para o post Compartilhar em outros sites
André D. Molin 15 Denunciar post Postado Agosto 20, 2010 Um prazo não deixa de ser uma data. Veja as palavras que usou no tópico e pense se é ou não uma data :). como faço para fazer o calculo de um periodo de tempo, acrescentando periodos? ex: tenho no meu banco, o campo anos, meses e dias [...] agora gostaria de acrescentar 5 meses, ai ficaria 4, 14 , 3 4 anos, 14 meses, 5 dias. mas esperaria 5 anos 2 meses, 5 dias. Fica ai a dica. Compartilhar este post Link para o post Compartilhar em outros sites
Haz 3 Denunciar post Postado Agosto 20, 2010 Ainda assim você pode usar a função mktime(). Dá uma olhada na documentação. Você pode recuperar o ano, mês e dia atual com a função date() e passar pros respectivos parâmetros do mktime() acrescidos do seu período. No caso de (mês atual + 14 meses), ele vai converter de forma apropriada para daqui há 1 ano e 2 meses. Ele retorna o timestamp que você pode usar em date('formato', timestamp) pra gerar a data formatada. Compartilhar este post Link para o post Compartilhar em outros sites
-rafael- 1 Denunciar post Postado Agosto 21, 2010 pessoal, obrigado pelas ajudas... mas eu não quero gerar uma data desses numeros que eu estou passando, muito menos quero acrescentar esses números na data atual. o que eu quero é pegar o prazo que o banco me retornou (4 anos, 14 meses, 5 dias) e transformar nem um periodo de tempo logico (5 anos 2 meses, 5 dias.). É isso que eu quero. vamos imaginar o seguinte: (acho q isso exemplifica o que eu quero) tem um bandido preso. ai ele foi condenado pelo juiz a 4 anos, 9 meses. ai depois ele vai tem outra pena de + 4 meses. então fica 5 anos e 2 meses. certo? é +- isso que eu quero. Compartilhar este post Link para o post Compartilhar em outros sites
André D. Molin 15 Denunciar post Postado Agosto 21, 2010 Hmmmm Agora sim, ta confirmado. Você DEVE utilizar campos do tipo DATE ou DATETIME. Vou te dizer uma coisa, e guarde ela sempre com você: quando for lidar com datas (mesmo que um "tempo lógico" como disse), trabalhe SEMPRE com DATE ou DATETIME. Se você estiver utilizando o MySQL, vai encontrar várias funções referentes a manipulação de datas, que são muito melhores do que o (desculpe dizer) POG que estava fazendo. Vamos considerar que o seu projeto seja de bandido como disse. Quando ele é condenado, o tempo de prisão dele começa a contar (tempo inicial). Esse tempo de prisão tem um fim (tempo final). Subtraindo essas duas datas, você obtem o periodo lógico que tanto falou. Resumindo: crie um campo DATE ou DATETIME que irá conter a data em que o bandido foi preso (data inicial), e um outro campo contendo a data de liberação desse bandido. Com esses valores em mãos, basta joga-los no PHP, utilizando o método diff() da classe DateTime. Feito isso você terá exatamente o que procura. E para completar, quando você quiser adicionar uma pena de 4 meses (como citou), você pode fazer diretamente na consulta ao MySQL utilizando a função DATE_ADD(). Enfim, espero que tenha entendido a minha mensagem. Desconsidere qualquer erro gramatical e etc por favor rs, to com fome. Compartilhar este post Link para o post Compartilhar em outros sites
-rafael- 1 Denunciar post Postado Agosto 21, 2010 André o detalhe não é bem esse, o que eu estou precisando é exatamente o que eu te falei, acrescentar 4 meses, no período de 4 anos e 9 meses eu não tenho uma data inicial, e uma data final. eu tenho um prazo, pena, período, seja lá o que for. mas não tenho data certa. imagine o seguinte: eu te pergunto quanto tempo leva para você fazer um projeto para mim? suponha que você diga 9 meses. ok. ai dali hum tempo você vem e me fala: "olha rafael, agente precisa estender este prazo, vamos acrescentar mais 4 meses, ok." então como fica? 14 meses? não, fica 1 ano e 2 meses. entendeu? nao tenho uma data inicial, ou final. só tenho o período. é isso. se fosse com datas, eu ja tinha pego o seu recado logo nos primeiros posts, com o mktime(). fácil fácil. mas infelizmente não é. obrigado pela ajuda Compartilhar este post Link para o post Compartilhar em outros sites
André D. Molin 15 Denunciar post Postado Agosto 21, 2010 Que pena que ainda não entendeu o que eu quis dizer. Boa sorte. Compartilhar este post Link para o post Compartilhar em outros sites
-rafael- 1 Denunciar post Postado Agosto 21, 2010 Andre, entendi sim o que você quer dizer. acho q você não entendeu o que eu quero dizer. eu nao tenho datas para comparar. eu nao tenho data de inicio e data final. eu so tenho o prazo. e tambem nem tenho como colocar esses campos na tabela, porque eu não tenho essas datas. eu nao tenho como te dizer se vai começar tal dia, ou terminar em outro dia. se eu tivesse datas, teria como fazer exatamente como você mostrou. obrigado Compartilhar este post Link para o post Compartilhar em outros sites
Julihermes Carlos 0 Denunciar post Postado Agosto 21, 2010 Acho que entendi o que você quer dizer. Como você usou o SUM para contar o período, creio que exista uma tabela de relacionamento em seu DB que (vou usar o exemplo do bandido) que relacione o bandido com o período de pena dele, para cada pena que ele recebe é adicionado uma linha na tabela contendo seu Primary Key e o período, seja ele em dias, meses ou anos. ok, foi assim que eu entendi. Minha solução: Para acrescentar algum mês você não deve mudar o campo ano, e assim também para o campo dia, se ele passar de 30 você não deve mudar o campo mês, ou seja, se você tem 9 meses e quer adicionar mais 4, adicione sem se preocupar com os anos. No caso você teria 4 anos e 14 meses e 40 dias, por exemplo, e você não mudaria nada no DB, deixaria exatamente como está. Agora vem o que você queria: Você só iria formatar esse seu período quando fosse utiliza-lo no PHP. Você cria uma função onde recebe os dias meses e anos e retorna ela formatada. assim toda vez que você usasse essa informação, você teria que usar esse função. Como assim? Na função você receberia os dias e verificava: Ele é maior que 30? se sim, seria adicionado 1 a uma variável auxiliar e você diminuiria a variável dias em 30. Ele é ainda maior que 30? se sim seria adicionado 1 a uma variável auxiliar e você diminuiria a variável dias em 30. E faria esse checagem ate que você tivesse um número de dias menor que 30. Depois você usa a variável mês: Seria adicionado o valor da variável Auxiliar na variável mês. Ele é maior que 12? se sim, seria adicionado 1 a uma variável auxiliar2 e você diminuiria a variável mês em 12. Ele é ainda maior que 12? se sim, seria adicionado 1 a uma variável auxiliar2 e você diminuiria a variável mês em 12. E faria esse checagem ate que você tivesse um número de meses menor que 12. Agora o ano: Seria adicionado o valor da variável Auxiliar2 na variável ano. Assim você retornaria o valor formatado do período. Você poderia também formatar direto no banco, para deixar mas fácil quando você fosse utilizar esses valores. Mas acho que seria mais trabalhoso, porque você teria que fazer vários SELECTs e vários UPDATEs e você teria que fazer outra função para fazer isso. Na primeira maneira que eu mostrei, você teria que fazer uma função para mostrar o valor e deixaria o INSERT mais amigável. Já na segunda maneira você mostraria de uma maneira mais fácil os valores, mas deixaria o INSERT mais trabalhoso. Acho que, com a maneira como você modelou seu DB, você não tem como deixar as duas opções(Mostrar e inserir) mais amigáveis, se uma está a outra não vai está. E acho que a maneira mais fácil é formatar quando vai mostrar e não quando vai inserir. Para finalizar (Eu sei que o post ficou grande, me desculpem), eu não desenvolvi o código e mostrei por duas questões: 1 - Eu estava com preguiça. hehe; 2 - Eu mostrei a lógica para que você aprenda mais quando for fazer o código. E fica a dica: Quando for usar dados representando tempo, seja la qual for sua derivação, Use sempre DATE ou DATETIME, SEMPRE, sem exclusividade. Eu não entendi muito bem qual a finalidade dessa modelagem que você fez. Quando se refere a período de tempo, todo tem que ter uma data de início e fim. Por exemplo, um projeto, se ele não tiver uma data de início e fim, ele não será um projeto; ele não estará na definição de projeto, que é: Uma sequência de passos finitos (tem data de inicio e fim) que levam a um objetivo (acho que é esse), se ele não for finito, se enquadra com definição de rotina. É isso ai, espero ter ajudado, apesar de exagerar no post. Até mais. Compartilhar este post Link para o post Compartilhar em outros sites
André D. Molin 15 Denunciar post Postado Agosto 21, 2010 Por exemplo, um projeto, se ele não tiver uma data de início e fim, ele não será um projeto; ele não estará na definição de projeto, que é: Uma sequência de passos finitos (tem data de inicio e fim) que levam a um objetivo (acho que é esse), se ele não for finito, se enquadra com definição de rotina. É o que eu tentei explicar... Compartilhar este post Link para o post Compartilhar em outros sites
-rafael- 1 Denunciar post Postado Agosto 22, 2010 bom pessoal, seguindo a dica de você, cheguei no que eu queria. com a função abaixo, o resultado foi o esperado. function cal_periodo($ano = 0, $mes = 0, $dia = 0){ $p = array(); $p['ano'] = $ano; $p['mes'] = $mes; $p['dia'] = $dia; $ac_mes = 0; $ac_ano = 0; if ($p['dia'] > 29){ $ac_mes = floor($p['dia']/30); $p['dia'] = $p['dia']%30; } $p['mes'] = $p['mes'] + $ac_mes; if ($p['mes'] > 11){ $ac_ano = floor($p['mes']/12); $p['mes'] = $p['mes']%12; } $p['ano'] = $p['ano'] + $ac_ano; $pf = ''; if (!empty($p['ano'])){ $pf .= $p['ano'] . ' ano(s)'; } if (!empty($p['mes'])){ if (!empty($p['ano'])){ $pf .= ', ' . $p['mes'] . ' mes(es)'; } else { $pf .= $p['mes'] . ' mes(es)'; } } if (!empty($p['dia'])){ if (!empty($p['mes']) || !empty($p['ano'])){ $pf .= ', ' . $p['dia'] . ' dia(s)'; } else { $pf .= $p['dia'] . ' dia(s)'; } } return $pf; } Andre e Carlos, eu entendi bem o que você quiseram me dizer. Data é data e ponto final. Apesar de ser iniciante em php e mysql, ja tenho uma noção de banco de dados e de como deve-se armazenar os dados. Este pode não ser o modo mais correto, mas é o necessário. Acontece que este é um projeto bem especifico. A necessidade é armazenar os periodos. É isso. Como eu disse, não ha data inicial nem final. Só existe o período e é isso que precisa ser armazenado. No fim das contas, preciso contar quanto ha de cada (anos, meses e dias), somar e ver o período total. É isso que o sistema pede. Como havia dito para vocês, se houvesse datas, inicio, fim, seria bem mais facil, pois bastava subtrair uma da outra, ou adicionar uma na outra e tchau. mas NESTE caso não é isso que foi pedido. Bom, no mais agradeço a ajuda de todos. e fica a função para alguém que precise. Compartilhar este post Link para o post Compartilhar em outros sites