Trabalhando com datas, armazenamento e manipulação.
Apesar dos meus 25 anos (minha idade quando esse artigo foi publicado) eu acho que tenho um pouco de experiência como programador, já com 15 anos já fazia meus 'hello word!!!' e com 17 anos já estava fazendo um sistema de controle de estoque em vb(hehehe, quem não faria), e de lá pra cá, trabalhar com datas sempre me deixava, deixa e porque não, deixará com uma pulga na orelha.
E logo porque trabalhar com datas me deixa tão confuso? Ora usa-se um campo datetime ou timestamp, e pronto certo? Certo, até precisarmos saber a distância(em dias,horas) entre duas datas, adicionar/subtrair um(ou mais) dia(s) em uma data, e tem coisa pior... e é por isso que serve aquelas funções mágicas para trabalhar com datas, em vb/asp tínhamos funções maravilhosas; mas o resultado dependia de como o seu servidor estava configurado. Se a data estivesse no formato americano era um jeito, se estivesse em formato brasiliero, era outro, e se o servidor iis estivesse diferente do sql server, aí segura nenêm.... E o mais bacana de tudo; sempre tem uma conversão pra lá outra pra cá.
Então conheci(a uns 3 anos e meio) o fabuloso mundo do php e o mysql, pelo melhor custo-benefício em hopedagem de pequenos sites(isso eu pensava na época, hoje em dia eu tenho total segurança nessa dupla).
Tive a necessidade óbvia de trabalhar com datas, e para minha surpresa, os argumentos das funções date(), gmdate(), entre outras que formatam datas, tem como argumento opcional um tal de unix timestamp.
Era só o que faltava, se vocês vissem a lista de funções que criei para automatizar as minhas datas ... mas beleza, isso vai se normalizando quando começamos a pensar melhor e conversar com a galera que é um pouco mais experiente em php, olhar os exemplos de script.
Perém a maior mudança que tive na forma de armazenar datas em banco foi quando comecei a fuçar alguns projetos open-source, mais particularmente o phpBB.
Na proxima página explicarei essa mudança...
E logo porque trabalhar com datas me deixa tão confuso? Ora usa-se um campo datetime ou timestamp, e pronto certo? Certo, até precisarmos saber a distância(em dias,horas) entre duas datas, adicionar/subtrair um(ou mais) dia(s) em uma data, e tem coisa pior... e é por isso que serve aquelas funções mágicas para trabalhar com datas, em vb/asp tínhamos funções maravilhosas; mas o resultado dependia de como o seu servidor estava configurado. Se a data estivesse no formato americano era um jeito, se estivesse em formato brasiliero, era outro, e se o servidor iis estivesse diferente do sql server, aí segura nenêm.... E o mais bacana de tudo; sempre tem uma conversão pra lá outra pra cá.
Então conheci(a uns 3 anos e meio) o fabuloso mundo do php e o mysql, pelo melhor custo-benefício em hopedagem de pequenos sites(isso eu pensava na época, hoje em dia eu tenho total segurança nessa dupla).
Tive a necessidade óbvia de trabalhar com datas, e para minha surpresa, os argumentos das funções date(), gmdate(), entre outras que formatam datas, tem como argumento opcional um tal de unix timestamp.
Era só o que faltava, se vocês vissem a lista de funções que criei para automatizar as minhas datas ... mas beleza, isso vai se normalizando quando começamos a pensar melhor e conversar com a galera que é um pouco mais experiente em php, olhar os exemplos de script.
Perém a maior mudança que tive na forma de armazenar datas em banco foi quando comecei a fuçar alguns projetos open-source, mais particularmente o phpBB.
Na proxima página explicarei essa mudança...
Bom artigo.
20/11/2008 4:25am
(~16 anos atrás)
Não sei se vc. percebeu mas com a sua dica, vc. abre o alerta para o problema que os sistemas onde o banco de dados foram construidos usando DATE/TIME terão em 2038, é um problema muito parecido com o tão EX-TEMIDO BUG DO MILÊNIO. Os programadores que leram esse artigo alertem para esse fato, se mês passado vc. modelou um banco de dados para uma grande empresa onde o volume de dados já é absurdamente grande, e o sistema já foi modificado por inumeros programadores, às vésperas de 2038, será um "corre corre" para reconfigurar os BDs e as Bilhares de Linhas de Códigos....
Sem Desesperos pessoal ainda temos 30 anos, mas por mim começo apartir de hj, a usar INT nos meus BD.
[]s e Parabéns mais uma vez pelo ótimo artigo.
Sem Desesperos pessoal ainda temos 30 anos, mas por mim começo apartir de hj, a usar INT nos meus BD.
[]s e Parabéns mais uma vez pelo ótimo artigo.
19/06/2006 4:39pm
(~18 anos atrás)
eu tava com um problema na hora de gerar relatorios!
muito util mesmo!!
usando a função strtotime consigo converter um data no formato ingles para segundo do TimeStamp.!
Muito bom mesmo.
Thiago
muito util mesmo!!
usando a função strtotime consigo converter um data no formato ingles para segundo do TimeStamp.!
Muito bom mesmo.
Thiago
27/03/2006 7:59am
(~18 anos atrás)
Flávio, valeu pela ajuda. eu estava precisando exatamente disso... deu uma ajuda e tanto...
flw!
flw!
18/11/2005 2:49pm
(~19 anos atrás)
Por exemplo pra uma tabela com noticias, onde vc tem muito select em cima desse campo da data, ou por periodo "(campo >= x and campo <= x)", ou principalmente utilizando num order by.
Ao criar um índice pra este campo, vc vai ter uma entrada pra cada registro no arquivo de indice, tornando lenta a inserção,exclusão e atualização de registros, quando esta tabela atingir um certo numero de registro, e se tratando de mysql, esse certo numero é baixo comparado ao outros banco de dados, até pq o mysql é um bando de dados, pq pra vc ter um banco consistente vc tem muito trabalho na sua aplicação.
Enfim neste exemplo de noticia a melhor saída seria um campo de data(date) e outro de hora, criando o inidice no campo de data.
Realmente trabalhando com mysql em pequenos projetos, utilizar a data em um campo int ou bigint é muito fácil. Mas para projetos que exijam uma maior segurança nos dados utilize um postgres, que é um banco de verdade e open source a altura dos comerciais, e utilizem para datas o date ou timestamp.
Ao criar um índice pra este campo, vc vai ter uma entrada pra cada registro no arquivo de indice, tornando lenta a inserção,exclusão e atualização de registros, quando esta tabela atingir um certo numero de registro, e se tratando de mysql, esse certo numero é baixo comparado ao outros banco de dados, até pq o mysql é um bando de dados, pq pra vc ter um banco consistente vc tem muito trabalho na sua aplicação.
Enfim neste exemplo de noticia a melhor saída seria um campo de data(date) e outro de hora, criando o inidice no campo de data.
Realmente trabalhando com mysql em pequenos projetos, utilizar a data em um campo int ou bigint é muito fácil. Mas para projetos que exijam uma maior segurança nos dados utilize um postgres, que é um banco de verdade e open source a altura dos comerciais, e utilizem para datas o date ou timestamp.
14/07/2005 4:29pm
(~19 anos atrás)
Colocando a data no formato para insercao no banco interbase/firebird/mysql:
Resolvido:
Com ajuda dos amigos:
Primeiro eu pego a data do form chamo a funcao converteData que transformará para data do banco interbase assim como: 2004-Nov-28
agora quando o usario entra com a data no form 28/11/2004 a funcao transforma na data para o banco interbase ou firebird e mysql, armazenando realmente a data digitada no form 28/11/2004.
antes ele invertia na hora de inserir no banco ficando 11/28/2004 só que nem chegava de armazenar dava um erro.
sigua os passos abaixo:
<?
$thisDATANASCIMENTO = converteData($thisDATANASCIMENTO);
function converteData($data){
if ($data == "")
return "";
if (substr($data,3,2) == "01"){
$mes = "Jan";
};
if (substr($data,3,2) == "02"){
$mes = "Feb";
};
if (substr($data,3,2) == "03"){
$mes = "Mar";
};
if (substr($data,3,2) == "04"){
$mes = "Apr";
};
if (substr($data,3,2) == "05"){
$mes = "May";
};
if (substr($data,3,2) == "06"){
$mes = "Jun";
};
if (substr($data,3,2) == "07"){
$mes = "Jul";
};
if (substr($data,3,2) == "08"){
$mes = "Aug";
};
if (substr($data,3,2) == "09"){
$mes = "Sep";
};
if (substr($data,3,2) == "10"){
$mes = "Oct";
};
if (substr($data,3,2) == "11"){
$mes = "Nov";
};
if (substr($data,3,2) == "12"){
$mes = "Dec";
};
$diavenc = substr($data,0,2);
$mesvenc = $mes;
$anovenc = substr($data,6,4);
$dataConvertida = $anovenc."-".$mesvenc."-".$diavenc;
return $dataConvertida;
}
?>
Resolvido:
Com ajuda dos amigos:
Primeiro eu pego a data do form chamo a funcao converteData que transformará para data do banco interbase assim como: 2004-Nov-28
agora quando o usario entra com a data no form 28/11/2004 a funcao transforma na data para o banco interbase ou firebird e mysql, armazenando realmente a data digitada no form 28/11/2004.
antes ele invertia na hora de inserir no banco ficando 11/28/2004 só que nem chegava de armazenar dava um erro.
sigua os passos abaixo:
<?
$thisDATANASCIMENTO = converteData($thisDATANASCIMENTO);
function converteData($data){
if ($data == "")
return "";
if (substr($data,3,2) == "01"){
$mes = "Jan";
};
if (substr($data,3,2) == "02"){
$mes = "Feb";
};
if (substr($data,3,2) == "03"){
$mes = "Mar";
};
if (substr($data,3,2) == "04"){
$mes = "Apr";
};
if (substr($data,3,2) == "05"){
$mes = "May";
};
if (substr($data,3,2) == "06"){
$mes = "Jun";
};
if (substr($data,3,2) == "07"){
$mes = "Jul";
};
if (substr($data,3,2) == "08"){
$mes = "Aug";
};
if (substr($data,3,2) == "09"){
$mes = "Sep";
};
if (substr($data,3,2) == "10"){
$mes = "Oct";
};
if (substr($data,3,2) == "11"){
$mes = "Nov";
};
if (substr($data,3,2) == "12"){
$mes = "Dec";
};
$diavenc = substr($data,0,2);
$mesvenc = $mes;
$anovenc = substr($data,6,4);
$dataConvertida = $anovenc."-".$mesvenc."-".$diavenc;
return $dataConvertida;
}
?>
07/12/2004 9:00am
(~20 anos atrás)
Tenho um sério problema.
Existe no php alguma função que converta do formato unix para o formato de data normal?
E gostaria de saber se também tem como separar, após a conversão, o dia, o mês, o ano, a hora etc.
Grato,
Mailson (mailson@gmail.com)
Existe no php alguma função que converta do formato unix para o formato de data normal?
E gostaria de saber se também tem como separar, após a conversão, o dia, o mês, o ano, a hora etc.
Grato,
Mailson (mailson@gmail.com)
19/11/2004 4:28pm
(~20 anos atrás)
Comentei isso pq tenho certa experiência em desenvolvimento OO e também de desenvolvimento de SGDB (meu tcc foi fazer um SGDB)
trabalho em uma instituição financeira com oracle e mysql, existem tableas com 20 milhoes de registros no oracle e uma mega velocidade. Trabalhei tb em uma empresa de radares de transito... imagina qtos carros passam por dia em um radar e depois pense em um ano, e eh registrado data e hora de qdo eles passam eh muita coisa mas enfim
bom mas tirar as coisas do banco em OO está certo... pq OO existe para você reusar as coisas, e de certa forma ter independencia.
se você faz algumas coisas no banco e amanha muda a camada de persistencia para XML... e ae como fica?
se vc muda o banco as funcoes mudam e ae? vai mudar o seu código tb? ou entao mudar todas as sua selects?
tá certo que devemos ver a perfomance das coisas, mas hj em um mundo onde existem coisas novas a todo dia devemos tb prever mudanças
nao critico o modo de gravar em int, vai da sua experiencia, facilidade com o uso e capacidade de adapta-lo a outras situacoes
eu até ja usei esse método, mas todo o meu trabalho era feito em classes que aceitavam timestamp como parametro, e constantes que definiam meu formatos, mesmo q muda a camada de persistencia ou mude o pais eh mudar constante e tá feito :-)
trabalho em uma instituição financeira com oracle e mysql, existem tableas com 20 milhoes de registros no oracle e uma mega velocidade. Trabalhei tb em uma empresa de radares de transito... imagina qtos carros passam por dia em um radar e depois pense em um ano, e eh registrado data e hora de qdo eles passam eh muita coisa mas enfim
bom mas tirar as coisas do banco em OO está certo... pq OO existe para você reusar as coisas, e de certa forma ter independencia.
se você faz algumas coisas no banco e amanha muda a camada de persistencia para XML... e ae como fica?
se vc muda o banco as funcoes mudam e ae? vai mudar o seu código tb? ou entao mudar todas as sua selects?
tá certo que devemos ver a perfomance das coisas, mas hj em um mundo onde existem coisas novas a todo dia devemos tb prever mudanças
nao critico o modo de gravar em int, vai da sua experiencia, facilidade com o uso e capacidade de adapta-lo a outras situacoes
eu até ja usei esse método, mas todo o meu trabalho era feito em classes que aceitavam timestamp como parametro, e constantes que definiam meu formatos, mesmo q muda a camada de persistencia ou mude o pais eh mudar constante e tá feito :-)
09/08/2004 11:56am
(~20 anos atrás)
E aí leassis,
Concordo que os SGBD tenham boas funções para trabalhar com datas, eu não estou defedendo o método(trabalhar com int), estou só mostrando que ele existe, que eu uso, e gosto.
Pelo fato de ser deselegante, cara eu já vi cada algorítimo OO, que fala sério, lembrando que eu sempre procuro fazer meus projetos, como máximo possível de OO.
Como você deve saber, o paradigma da programação (seja OO, seja estruturado, seja int, seja date), se aplica a necessidade.
Ao fazer um sistema operacional, você usa C, ao fazer um SGBD, ou um servidor web você usaria C++, mas ficaria mais lento do que o seu concorrente em C(msysql é c, apache é c, php é c), se você quer guardar uma data em banco e retornar ela MAIS RÁPIDO, guarde em int; cara quem é maior? um campo int ou um campo string que ainda por cima tem validação em algoríto pre-definido(como um date ou timestamp)? Isso não se descute. Eu não estou falando de 6000 registros eu estou falando de 4.000.000, que é o caso de uma base de log de transação de um servidor movimentado. Tá etendendo? Número x String?
Se você quer ser elegnte, use padrões e procedimentos de programações profissionais, não sei onde você leu que devemos tirar as operações do banco e colocar nas classes, mas se o banco faz pra você pra que tirar dele?
A minha proposta é: vc tem um log, ou data de insrição no site?
O que você faz no log retorna as datas e coloca-o legível, no máximo faz cruzamento de datas; mas a base é grande; armazene em int e converta na aplicação pq o PHP tem toda uma otimização para trabalhar assim...
O que vc faz em uma data de inscrição? É uma base menor mas pode crescer, mas você só faz verificar a quanto tempo o cara tá inscrito, se não expirou a senha(tipo de 3 em três meses troca-se a senha), cara isso é conta de menos com int, usando date é no mínimo datediff, e olhe lá.
Agora se você vai trabalhar com data de nascimento, data de criaçõa da ponte, beleza trabalhe com o date, pouco dado, pouco processamento, essa foi a linha de raciocínio do artigo.
Mas mesmo assim muito obrigado pelo interesse no artigo, gosto de uma boa discursão, você não está errado, acho você não está invalidando o artigo, só contribuindo para o conhecimento.
Um abraço,
Piraz
Concordo que os SGBD tenham boas funções para trabalhar com datas, eu não estou defedendo o método(trabalhar com int), estou só mostrando que ele existe, que eu uso, e gosto.
Pelo fato de ser deselegante, cara eu já vi cada algorítimo OO, que fala sério, lembrando que eu sempre procuro fazer meus projetos, como máximo possível de OO.
Como você deve saber, o paradigma da programação (seja OO, seja estruturado, seja int, seja date), se aplica a necessidade.
Ao fazer um sistema operacional, você usa C, ao fazer um SGBD, ou um servidor web você usaria C++, mas ficaria mais lento do que o seu concorrente em C(msysql é c, apache é c, php é c), se você quer guardar uma data em banco e retornar ela MAIS RÁPIDO, guarde em int; cara quem é maior? um campo int ou um campo string que ainda por cima tem validação em algoríto pre-definido(como um date ou timestamp)? Isso não se descute. Eu não estou falando de 6000 registros eu estou falando de 4.000.000, que é o caso de uma base de log de transação de um servidor movimentado. Tá etendendo? Número x String?
Se você quer ser elegnte, use padrões e procedimentos de programações profissionais, não sei onde você leu que devemos tirar as operações do banco e colocar nas classes, mas se o banco faz pra você pra que tirar dele?
A minha proposta é: vc tem um log, ou data de insrição no site?
O que você faz no log retorna as datas e coloca-o legível, no máximo faz cruzamento de datas; mas a base é grande; armazene em int e converta na aplicação pq o PHP tem toda uma otimização para trabalhar assim...
O que vc faz em uma data de inscrição? É uma base menor mas pode crescer, mas você só faz verificar a quanto tempo o cara tá inscrito, se não expirou a senha(tipo de 3 em três meses troca-se a senha), cara isso é conta de menos com int, usando date é no mínimo datediff, e olhe lá.
Agora se você vai trabalhar com data de nascimento, data de criaçõa da ponte, beleza trabalhe com o date, pouco dado, pouco processamento, essa foi a linha de raciocínio do artigo.
Mas mesmo assim muito obrigado pelo interesse no artigo, gosto de uma boa discursão, você não está errado, acho você não está invalidando o artigo, só contribuindo para o conhecimento.
Um abraço,
Piraz
09/08/2004 9:21am
(~20 anos atrás)
Eu tenho minhas duvidas se se int eh mais rapido que date mas enfim
gravar data em int no banco nao parece ser muito elegante...
os SGDB oferecem boas funcoes para se trabalhar com datas eh soh usar
em OO devemos tirar algumas operacoes do banco e fazer nas nossas classes de negócio o ideal seria fazer uma classe para tratamentos de datas, com uma constante no padrão da data do pais e outra constante com o formato do banco... acho q mata todos os problemas
gravar data em int no banco nao parece ser muito elegante...
os SGDB oferecem boas funcoes para se trabalhar com datas eh soh usar
em OO devemos tirar algumas operacoes do banco e fazer nas nossas classes de negócio o ideal seria fazer uma classe para tratamentos de datas, com uma constante no padrão da data do pais e outra constante com o formato do banco... acho q mata todos os problemas
08/08/2004 8:58pm
(~20 anos atrás)