Sql datediff em datas não contíguas
Pergunta
Eu tenho uma mesa que se parece com o seguinte:
Code Mark Date Notional
Beta 5/1/2008 $1,102,451.00
Beta 5/2/2008 $1,102,451.00
Beta 5/5/2008 $1,102,451.00
Beta 5/6/2008 $1,102,451.00
Preciso criar uma tabela que tenha todas as datas da marca em uma coluna e a diferença entre cada data de marca adjacente quando classificada em outra coluna. Este é o SQL que escrevi:
SELECT
Current.[Mark Date],
Prev.[Mark Date],
(DATEDIFF("d", Prev.[Mark Date], Current.[Mark Date])/365)
FROM Notional as Prev, Notional as Current
WHERE (Prev.[Mark Date] = (Current.[Mark Date]-1));
No entanto, este SQL não se juntará ao fim de semana 5/5/2008 -> 5/2/2008, por exemplo ou em longos fins de semana. Como eu iria fazer a mesa se juntar a datas não contíguas? Obrigado por toda a ajuda!
Solução
A única maneira de fazer isso é usar row_number (e row_number+1) em uma seleção ordenada por data para um SQL que suporta números de linha ou para criar uma tabela temporária com uma chave de incremento automático que você preencha em ordem de data.
Não há outra maneira sem recorrer a uma solução não-JOIN (que é um loop.)
Outras dicas
Você pode tentar usar row_number ao selecionar e entrar nesse pedido até a data.
EDITAR. Feito com junções.
O que você pode fazer é se juntar à tabela para si mesmo, em datas maiores que essa linha, e depois agrupar e selecionar o min.
Algo assim
DECLARE @Table TABLE(
DateVal DATETIME
)
INSERT INTO @Table SELECT '01 May 2009'
INSERT INTO @Table SELECT '02 May 2009'
INSERT INTO @Table SELECT '05 May 2009'
INSERT INTO @Table SELECT '06 May 2009'
SELECT t.DateVal,
MIN(tNext.DateVal) NextDate
FROM @Table t LEFT JOIN
@Table tNext ON t.DateVal < tNext.DateVal
GROUP BY t.DateVal
Eu sei que esse é o código do SQL Server, mas pode ser facilmente alterado para o MS Access.
Isso deve devolver o seguinte:
StartDate EndDate
2009-05-01 00:00:00.000 2009-05-02 00:00:00.000
2009-05-02 00:00:00.000 2009-05-05 00:00:00.000
2009-05-05 00:00:00.000 2009-05-06 00:00:00.000
2009-05-06 00:00:00.000 NULL