Ajuda com SQL

Firebird

23/10/2006

Pessoal,

Tenho um campo TDate e preciso atualizar o Ano de vencimento.
Como posso atualizar apenas o campo Ano e manter os outros campos como Dia e Mes?

Obrigado.


Yallebr

Yallebr

Curtidas 0

Respostas

Tiagorocha

Tiagorocha

23/10/2006

Dê uma olhada em: Unit DateUtils -> IncYear, IncMonth, IncDay


GOSTEI 0
Delmar

Delmar

23/10/2006

Uma outra possibilidade é tentar compor uma data com o dia e mes da data anterior e ler em um novo campo apenas o ano:

veja se estes trechos de códigos podem lhe ajudar, eu não adaptei nada mas serve de exemplo para ver como pegar apenas o dia e o mês e ir concatenando


nataEscolarImpPaisagemSem1.QRmemo1.Lines.Text:=´AO(S) ´+formatdatetime(´dd´, DateTimePicker1.Date)+´ DIA(S) DO MÊS DE ´+ Ansiuppercase(formatdatetime(´mmmmm´, DateTimePicker1.Date))+ ´ DE ´+formatdatetime(´yyyy´, DateTimePicker1.Date)+´ CONCLUIU-SE....´;
nataEscolarImpPaisagemSem1.QRLabel1.Caption:=dmc.QescolaPadraocidade.AsString+´/´+dmc.QescolaPadraouf.AsString+ ´ ´+formatdatetime(´dd´, date())+´ DE ´+ Ansiuppercase(formatdatetime(´mmmmm´, date()))+ ´ DE ´+formatdatetime(´yyyy´, date());


GOSTEI 0
Yallebr

Yallebr

23/10/2006

Pessoal desculpa,

Me expressei muito mal, gostaria de fazer isso utilizando SQL. Utilizo FB 1.5

Obrigado


GOSTEI 0
Tiagorocha

Tiagorocha

23/10/2006

Certo... nesse caso você vai precisar instalar uma biblioteca UDF no teu Firebird... eu particularmente uso a TBUDF, que tem uma função chamada UDF_INCMONTH que resolve esse problema de maneira bastante prática.
Se cadastra no site Firebase (www.firebase.com.br) e procura a TBUDF na seção de Downloads (http://www.firebase.com.br/fb/downloads.php?id=14).


GOSTEI 0
Adriano Santos

Adriano Santos

23/10/2006

Como posso atualizar apenas o campo Ano e manter os outros campos como Dia e Mes?


Como assim ´CAMPO´ e manter os outros os outros campos como dia e mes? Não entendi.


GOSTEI 0
Yallebr

Yallebr

23/10/2006

Olá Adriano,

Tenho um campo chamado Data do time Date.

Eu tenho N registros assim
01/01/2005
01/02/2005
01/03/2005
15/04/2005
....
....

Eu quero manter o Dia e o Mes. e trocar isso para assim:
01/01/200[b:b8ddfe7eb8]6[/b:b8ddfe7eb8]
01/02/200[b:b8ddfe7eb8]6[/b:b8ddfe7eb8]
01/03/200[b:b8ddfe7eb8]6[/b:b8ddfe7eb8]
15/04/200[b:b8ddfe7eb8]6[/b:b8ddfe7eb8]
....
....

Tipo um IncYear porém em SQL. Obrigado.


GOSTEI 0
Motta

Motta

23/10/2006

Vc tem de saber as funcoes de manipulacaom de data
no Oracle ficaria algo assim :

select to_date(to_char(sysdate,´dd´) || to_char(sysdate,´mm´) || ´2013´,´ddmmyyyy´)
from dual


o to_char extraí o dia ou mes da data do sistema
2013 é um constante e to_date reconverte para data
(passando o formato)

seria traduzir estas funcoes para ib


GOSTEI 0
Adriano Santos

Adriano Santos

23/10/2006

Vc tem de saber as funcoes de manipulacaom de data no Oracle ficaria algo assim :
select to_date(to_char(sysdate,´dd´) || to_char(sysdate,´mm´) || ´2013´,´ddmmyyyy´)
from dual
o to_char extraí o dia ou mes da data do sistema 2013 é um constante e to_date reconverte para data (passando o formato) seria traduzir estas funcoes para ib



Ahhhhhhhh entendi, pow eu tava tentando fazer exatemante isso pra IB/FB [b:fd13062607]Motta[/b:fd13062607], ainda não consegui.


GOSTEI 0
Motta

Motta

23/10/2006

Sei que EXTRACT separa ano mes e dia, e CAST permite reconverter para data , mas não sei a sintaxe correta.


GOSTEI 0
Adriano Santos

Adriano Santos

23/10/2006

Sei que EXTRACT separa ano mes e dia, e CAST permite reconverter para data , mas não sei a sintaxe correta.


Eu vou montar aqui, tava usando Extract, mas num sabia como usar o Cast. Acho que já sei como fazer.


GOSTEI 0
Tiagorocha

Tiagorocha

23/10/2006

Sintaxe do Cast:
CAST(CAMPO AS TIPO)



GOSTEI 0
Adriano Santos

Adriano Santos

23/10/2006

Consegui,

Fiz o teste aqui e funcionou:

UPDATE MINHA_TABELA SET
   MINHA_TABELA.MEU_CAMPO_DATA =
     (CAST(CAST(EXTRACT(DAY FROM MINHA_TABELA.MEU_CAMPO_DATA) AS INTEGER) AS INTEGER) || ´/´ ||
      CAST(CAST(EXTRACT(MONTH FROM MINHA_TABELA.MEU_CAMPO_DATA) AS INTEGER) AS INTEGER) || ´/´ ||
      CAST(CAST(EXTRACT(YEAR FROM (MINHA_TABELA.MEU_CAMPO_DATA +365)) AS INTEGER) AS INTEGER))
WHERE
  EXTRACT(YEAR FROM MINHA_TABELA.MEU_CAMPO_DATA) = 2002


Repare o [b:6df32f3409]+365[/b:6df32f3409]. Estou adicionando 365 dias ao ano, ou seja, + 1 ano.

Talvez com base nisso a galera consiga ver algo mais fácil.
Fui


GOSTEI 0
Tiagorocha

Tiagorocha

23/10/2006

[quote:dd3f78b594=´Adriano Santos´]Consegui,
Repare o [b:dd3f78b594]+365[/b:dd3f78b594]. Estou adicionando 365 dias ao ano, ou seja, + 1 ano.

Talvez com base nisso a galera consiga ver algo mais fácil.
Fui[/quote:dd3f78b594]

Que tal assim:
SELECT
CAST(CAST(EXTRACT(DAY FROM CURRENT_DATE) AS INTEGER) AS INTEGER)||´/´||
CAST(CAST(EXTRACT(MONTH FROM CURRENT_DATE) AS INTEGER) AS INTEGER)||´/´||
CAST(CAST(EXTRACT(YEAR FROM (CURRENT_DATE))+1 AS INTEGER) AS INTEGER)
FROM RDB$DATABASE


Parabéns Adriano, o negócio é trabalhoso, mas é muito legal a idéia!


GOSTEI 0
Adriano Santos

Adriano Santos

23/10/2006

[quote:c360bb90cd=´Adriano Santos´]Consegui, Repare o [b:c360bb90cd]+365[/b:c360bb90cd]. Estou adicionando 365 dias ao ano, ou seja, + 1 ano. Talvez com base nisso a galera consiga ver algo mais fácil. Fui


Que tal assim:
SELECT
CAST(CAST(EXTRACT(DAY FROM CURRENT_DATE) AS INTEGER) AS INTEGER)||´/´||
CAST(CAST(EXTRACT(MONTH FROM CURRENT_DATE) AS INTEGER) AS INTEGER)||´/´||
CAST(CAST(EXTRACT(YEAR FROM (CURRENT_DATE))+1 AS INTEGER) AS INTEGER)
FROM RDB$DATABASE

[/quote:c360bb90cd]

Intão [b:c360bb90cd]ThiagoRocha[/b:c360bb90cd] pelo que entendi o [b:c360bb90cd]yallebr[/b:c360bb90cd] tem um campo na tabela que precisa ser acrescentado um ano, por isso fiz o esquema para adicionar 365 dias (1 ano).

O Tenho um campo TDate e preciso atualizar o Ano de vencimento.


O [b:c360bb90cd]CURRENT_DATE[/b:c360bb90cd] date vai adicionar 1 ano a data atual certo? Num sei, depende do que ele precisa. Se for como eu falei o meu esquema vai funcionar perfeitamente, porém ele pode ter uma tipo que o vencimento seja 2005 e vai ser mudada para 2006, ainda vai ficar errado rsrs...

Resumindo: os dois modos funcionam, valeu por ajudar tb. Agora ele escolhe o método que melhor se encaixa com a necessidade.

Parabéns Adriano, o negócio é trabalhoso, mas é muito legal a idéia!


Opa, obrigado.


GOSTEI 0
Tiagorocha

Tiagorocha

23/10/2006

É isso aí Adriano, vc postou o código que atualiza a tabela avançando a data original em um ano. Para isso você somou 365 dias na data original.

Eu postei um código que eu estava usando ontem para testar a função EXTRACT, corrigido com base nas informações do código que você postou.

Meu código simplesmente exibe a data atual do sistema incrementada em um ano, somando 1 ao ano após este haver sido extraído pela função EXTRACT. Só isso, sem pretensão nenhuma de ser ´melhor´ que o seu, hehehe :P


GOSTEI 0
Tiagorocha

Tiagorocha

23/10/2006

Esse código que eu postei é o código que eu estava usando ontem para testar a função EXTRACT (não sabia que ela existia e fiquei curioso depois que li este tópico). Ele não estava funcionando pq eu estava usando a função CAST de maneira errada. Quando vi o código do Adriano hoje cedo, corrigi os CASTs e o código funcionou.

As diferenças entre o código do Adriano são:
1. O código do Adriano atualiza a tabela, o meu não.
2. O código do Adriano soma 365 dias na data e extrai o ano, o meu extrai o ano e soma 1 ao resultado.

Se a data atual for 1º de Janeiro de um ano bissexto e você somar 365 dias, vai obter 31 de Dezembro como resultado (1/1/2008 + 365 dias = 31/12/2008). Nesse caso, o método do Adriano falha. O ideal seria juntar os dois mais ou menos assim:
UPDATE MINHA_TABELA SET
   MINHA_TABELA.MEU_CAMPO_DATA =
     (CAST(CAST(EXTRACT(DAY FROM MINHA_TABELA.MEU_CAMPO_DATA) AS INTEGER) AS INTEGER) || ´/´ ||
      CAST(CAST(EXTRACT(MONTH FROM MINHA_TABELA.MEU_CAMPO_DATA) AS INTEGER) AS INTEGER) || ´/´ ||
      CAST(CAST(EXTRACT(YEAR FROM (MINHA_TABELA.MEU_CAMPO_DATA))+1 AS INTEGER) AS INTEGER))
WHERE
  EXTRACT(YEAR FROM MINHA_TABELA.MEU_CAMPO_DATA) = 2002



GOSTEI 0
Adriano Santos

Adriano Santos

23/10/2006

sem pretensão nenhuma de ser ´melhor´ que o seu, hehehe :P


Que isso cara, tranquilo. Não pensei nada disso. :wink: :wink:
Pena que o autor do tópico nem retornou pra dizer se funcionou ou não.

Fui


GOSTEI 0
POSTAR