SQL DATEDIFF超过非连续日期

时间:2009-11-23 19:56:08

标签: sql datediff

我有一张看起来像这样的表:

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

我需要创建一个表,其中包含一列中的所有标记日期,以及在另一列中排序时每个相邻标记日期之间的差异。这是我写的SQL:

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));

但是,这个SQL将不会在周末加入5/5/2008 - >例如,在2008年5月2日或长周末。我如何让桌子在非连续日期自我加入?谢谢你的帮助!

2 个答案:

答案 0 :(得分:1)

按日期选择并加入该订单时,您可以尝试使用ROW_NUMBER。

EDIT。完成加入。

您可以做的是在比该行更大的日期将表连接到自身,然后分组并选择最小值。

像这样的东西

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

我知道这是Sql Server代码,但可以很容易地更改为MS Access。

这应该返回以下内容:

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

答案 1 :(得分:1)

执行此操作的唯一方法是对支持行号的SQL按日期排序选择使用ROW_NUMBER(和ROW_NUMBER + 1),或者使用按日期顺序填充的自动增量键创建临时表。

如果不采用非连接解决方​​案(即循环),没有其他办法。