Função para retornar uma data com 90 dias de diferença

hefguerra

Power Member
Boa tarde,

Pretendo uma função que me retorne um valor com 90 dias de diferença.
Imaginem que tenho um campo1 = 100€ que é de 05/03/2020, e pretendo retornar o campo2 = 150€ que é de 90 dias atrás, 05/01/2020.
Onde a minha conta final vai ser [ 100€(05.03.2020) - 150€(05.01.2020) ] / 150€(05.01.2020)
Em SQL.
 
Fica um esboço do que quero fazer.
IMG-20200625-115943.jpg

Esta data2 tem de ter menos 90 dias.
 
Já não mexo com pl-sql desde 2007 mas experimenta "select sysdate - 1 from dual"

Ou "select (sysdate - interval '1' day) from dual" (esta já fui pesquisar)

O objectivo é subtrair um dia à data de sistema, no teu caso seria retirar 30 dias a uma data de referencia
 
Última edição:
boas Greywolf,
Eu consigo trazer as datas que quero, a original e a menos 90 dias. Mas o problema esta em fazer aquela conta que tenho na imagem.
O Valor1 é referente a data original e o valor2 é referente a data com menos 90 dias. E tenho de fazer (Valor1-valor2)/valor2. Estes valores tem de estar de acordo com as datas. Tanto o Valor como a Data pertencem a mesma tabela, tendo uma colona com os valores e outra coluna com datas.
 
Então consegues retornar 0s 2 registos com data/valor.
O que pretendes é no próprio select fazer o calculo e não consegues pois estão em registos diferentes?
Se sim podes fazer um cte ou subquerie para isolar uma das parcelas e poderes fazer o calculo no select principal.
 
Ve se pela imagem seguinte consegues entender melhor o problema.
IMG-20200625-142857.jpg


Vem tudo da mesma tabela. Já consigo trazer a data original e data - 90 dias. O que não consigo é fazer a conta e ao mesmo tempo dizer que o valor pertence a data original e o outro pertence a uma data com - 90 dias. Tudo feito num unico select.
Exemplo: (200€-100€)/100€, conforme a imagem
 
Penso que a minha resposta anterior responde ao problema.
O teu problema é teres os dois registos como se fosse um só registo e identificados para saberes que valor pertence a que data.

Eu não tenho oracle para testar mas tenho sql server.
Faz os ajustes para isto funcionar, ou seja, traduz de t-sql para pl-sql.

CREATE TABLE [dbo].[Tabela](
[dDate] [datetime] NOT NULL,
[nValue] [int] NOT NULL
) ON [PRIMARY]
GO
INSERT [dbo].[Tabela] ([dDate], [nValue]) VALUES (CAST(N'2020-06-25T18:44:11.180' AS DateTime), 100)
GO
INSERT [dbo].[Tabela] ([dDate], [nValue]) VALUES (CAST(N'2020-05-26T18:44:11.180' AS DateTime), 150)
GO


;WITH targetTable (dTargetDate, nTargetValue)
as(select dDate, nValue from Tabela)
select *
from Tabela a
inner join targetTable b ON b.dTargetDate = DATEADD(DAY, -30,a.dDate)


O resultado disto é uma linha com:

dDate = 2020-06-25 18:44:11.180 (data referencia)
nValue = 100 (valor referência)
dTargetDate = 2020-05-26 18:44:11.180 (data de há 30 dias atrás)
nTargetValue = 150 (valor de há 30 dias atrás, ou seja, o mesmo registo da coluna anterior)

2020-06-25 18:44:11.180 100 2020-05-26 18:44:11.180 150

Com este registo não consegues fazer já o calculo?
 
Viva.
Tenta assim.

select (sum(valor1)-sum(valor2))/sum(valor2)
from (
select valor valor1, 0 valor2
from tabela
where data=<data1>
union
select 0 valor 1, valor valor2
from tabela
where data=<data2>
)
 
Boas pessoal,
Amanha quando for trabalhar tento. Realmente é por estar tudo na mesma tabela e nas mesmas colunas, que me esta a criar :blubomte:
 
Dica: podes usar a mesma tabela duas vezes na mesma query

Select (a.valor + b.valor)/b.valor
From tabela a,
Tabela b
Where b.data = a.data - 90
 
Back
Topo