Acrescentar 100 anos na data
Amigos, estou importando os dados de uma tabela .dbf de um sistema antigo (feito em clipper). Acontece que quando estou importando datas, como o ano é com 2 dígitos, no momento da importação, quando vai gravar no firebird, a data, por exemplo: 23/05/07, ao invés de gravar 23/05/2007, fica 23/05/1907. Gostaria de saber como eu faço para gravar 2007. Se não tiver como, como eu acrescento + 100 anos na data para ficar correto?
Aflsilva
Curtidas 0
Respostas
Massuda
23/05/2007
Normalmente o que se faz neste caso é escolher um ano qualquer como sendo o ´pivô´. Valores acima do pivô são do século passado, valores abaixo do pivô são deste século.
Por exemplo, escolhendo 1980 como sendo o pivô, você teria...
01/01/80 = 01/01/1980
...
01/01/99 = 01/01/1999
01/01/00 = 01/01/2000
...
01/01/79 = 01/01/2079
...o código é algo assim...
Por exemplo, escolhendo 1980 como sendo o pivô, você teria...
01/01/80 = 01/01/1980
...
01/01/99 = 01/01/1999
01/01/00 = 01/01/2000
...
01/01/79 = 01/01/2079
...o código é algo assim...
// assume que 0 <= Ano <= 99 if Ano < 80 then Ano := Ano + 2000 else Ano := Ano + 1900
GOSTEI 0
Aflsilva
23/05/2007
Massuda, poderia me explicar melhor, porque não estou conseguindo fazer como você colocou. Como eu faço para colocar da maneira que você fez? Eu extraio apenas o ano da data e depois coloco de volta? como eu faço? :(
GOSTEI 0
Moura
23/05/2007
aflsilva,
nesse caso a lógica é outra.
Tenho aplicações para micros e pequenas empresas, de vez em quando me deparo com o mesmo problema. Importar dados de antigos sistema em clipper ( :D saudades!).
[b:e545b1538b][LÓGICA DO CLIPPER][/b:e545b1538b]
([i:e545b1538b]não sei vc se chegou a programar em Clipper[/i:e545b1538b])
O Clipper interpretava DATAS usando apenas 8 digitos. Para 10 digitos o programador tinha de formatar isso na unha como nos comando abaixo,
(tipo ONCREATE do formulário principal de nossa aplicação em Delphi)
Lembre-se desses comandos do Clipper:
- SET CENTURY ON // Interpretar Século Presente
- SET DATE TO BRITISH // Converter data para o formato europeu que tambem é a nossa forma de tratar datas.
- SET DATE FORMAT TO ´DD/MM/YYYY´
Quanto ao ´SET CENTURY ON´ (formatava o sistema para levar em conta o século presente) de acordo com a data do computador.
Esse comando intepretava automaticamente anos de 2 digitos.
Exemplo: se a data do computador estivesse ne seculo x900 (1900 até 1999) e o usuario informasse 23/05/07, então automaticamente o sistema convertia para 23/05/1907.
Como mudamos de século estamos em 2000..., se o usuario informasse 23/05/07, então automaticamente o sistema convertia para 23/05/2007.
Quando chegar a 2100 começa como no exemplo de 1900 e assim por diante.
[b:e545b1538b][TEMPOS ATUAIS][/b:e545b1538b]
Infelizmene se o programador CLIPPER não tomou esses cuidados você terá de resolver isso manualmente.
Primeiro você deve utilizar alguma ferramenta (DBU ou Database Desktop) para se certificar que a coluna esteja no formado DATE.
Então você terá de decodificar e extrair ´dia´, ´mes´ e ´ano´ com o comando [i:e545b1538b][b:e545b1538b]DecodeDate[/b:e545b1538b][/i:e545b1538b] do Delphi.
Eu tenho uma função que uso para tratar datas. espero que te dê uma LUZ:
Importe os dados e deixe com data 19...
[color=green:e545b1538b]
[/color:e545b1538b]
Utilize assim:
[color=green:e545b1538b]
[/color:e545b1538b]
Espero que possa te ajudar.
nesse caso a lógica é outra.
Tenho aplicações para micros e pequenas empresas, de vez em quando me deparo com o mesmo problema. Importar dados de antigos sistema em clipper ( :D saudades!).
[b:e545b1538b][LÓGICA DO CLIPPER][/b:e545b1538b]
([i:e545b1538b]não sei vc se chegou a programar em Clipper[/i:e545b1538b])
O Clipper interpretava DATAS usando apenas 8 digitos. Para 10 digitos o programador tinha de formatar isso na unha como nos comando abaixo,
(tipo ONCREATE do formulário principal de nossa aplicação em Delphi)
Lembre-se desses comandos do Clipper:
- SET CENTURY ON // Interpretar Século Presente
- SET DATE TO BRITISH // Converter data para o formato europeu que tambem é a nossa forma de tratar datas.
- SET DATE FORMAT TO ´DD/MM/YYYY´
Quanto ao ´SET CENTURY ON´ (formatava o sistema para levar em conta o século presente) de acordo com a data do computador.
Esse comando intepretava automaticamente anos de 2 digitos.
Exemplo: se a data do computador estivesse ne seculo x900 (1900 até 1999) e o usuario informasse 23/05/07, então automaticamente o sistema convertia para 23/05/1907.
Como mudamos de século estamos em 2000..., se o usuario informasse 23/05/07, então automaticamente o sistema convertia para 23/05/2007.
Quando chegar a 2100 começa como no exemplo de 1900 e assim por diante.
[b:e545b1538b][TEMPOS ATUAIS][/b:e545b1538b]
Infelizmene se o programador CLIPPER não tomou esses cuidados você terá de resolver isso manualmente.
Primeiro você deve utilizar alguma ferramenta (DBU ou Database Desktop) para se certificar que a coluna esteja no formado DATE.
Então você terá de decodificar e extrair ´dia´, ´mes´ e ´ano´ com o comando [i:e545b1538b][b:e545b1538b]DecodeDate[/b:e545b1538b][/i:e545b1538b] do Delphi.
Eu tenho uma função que uso para tratar datas. espero que te dê uma LUZ:
Importe os dados e deixe com data 19...
[color=green:e545b1538b]
Function Dia(vData:TDate):Integer; Function Mes(vData:TDate): Integer; Function Ano(vData:TDate):Integer; (...) // Retorna o Dia de uma data Function Dia(vData:TDate):Integer; Begin DecodeDate(vData,Year,Month,Day); Result:=Day; end; // Retorna o Mes de uma data Function Mes(vData:TDate):Integer; Var wDia, wMes, wAno : Word; Begin DecodeDate(vData,Year,Month,Day); Result:=Month; end; // Retorna o Ano de uma data Function Ano(vData:TDate):Integer; Begin DecodeDate(vData,Year,Month,Day); Result:=Year; end;
[/color:e545b1538b]
Utilize assim:
[color=green:e545b1538b]
(...) Var NovaData : Date; xAno : Integer; Begin Tabela.First; While not Tabela.eof do begin NovaData :=´´; xAno :=0; xAno :=ANO(Tabela.FieldByName(´DATA´).AsDateTime); // aflsilva, trate aqui ANO (acho que aqui entra aquela sua ideia de acrescentar 100 no ano ) If xAno<2000 then xAno := xAno + 100; NovaData := IntToStr( DIA(Tabela.FieldByName(´DATA´).AsDateTime) ) +´/´+ IntToStr( MES(Tabela.FieldByName(´DATA´).AsDateTime) ) +´/´+ IntToStr( xAno ); Tabela.Edit; Tabela.FieldByName(´DATA´).AsDateTime :=StrToDate(NovaData); Tabela.Post; Tabela.Next; // passar para o proximo registro end; End;
[/color:e545b1538b]
Espero que possa te ajudar.
GOSTEI 0
Aflsilva
23/05/2007
Moura, muito obrigado pela ajuda. Funcionou do jeito que eu queria. Agradeço demais a ajuda! :D .Só para completar, eu começei a programar com clipper (não sei se é o seu caso). Agora só trabalho com delphi. Obrigado pela ajuda! :wink:
GOSTEI 0
Moura
23/05/2007
Só para completar, eu começei a programar com clipper (não sei se é o seu caso). Agora só trabalho com delphi. Obrigado pela ajuda! :wink:
A primeira linguagem que aprendi foi BASIC, depois ASSEMBLER, depois MS-QUICK BASIC e para fins comerciais comecei com o ´Clipper 5.0´.
O importante é que a ajuda deu certo... qualquer coisa estamos aí!!!
GOSTEI 0