2009-11-23 56 views
2

我有一个表,如下所示: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日例如或长周末。我该如何去让桌子在非连续的日期自我加入?感谢所有的帮助!

+0

我只是好奇这一点。是否有一个名为Notional的表和一个名为Notional的字段?另外,当你说“这个SQL不会加入”时,你是什么意思?你能给个例子吗? – PowerUser 2009-11-23 20:00:35

+0

你不能在星期几使用CASE声明加入星期一至星期五 星期二至星期一 与星期一等等 – AntDC 2012-09-06 14:42:01

回答

1

做到这一点的唯一方法是在选择按日期为支持行号,或创建一个SQL命令使用ROW_NUMBER(和ROW_NUMBER + 1)临时表,带有按日期顺序填充的自动递增键。

没有诉诸非加入解决方案(这是一个循环)没有其他方式。

+0

好吧,我必须创建一个临时表与自动递增键,因为我正在使用ACCESS 2007年...任何想法如何做到这一点? – 2009-11-23 20:17:03

+0

不是我的头顶 - 我相信你在声明表格时使用了auto关键字。 请确保您是否创建临时表,而不是将所有字段放在临时表中 - 最好是临时表有两个字段 - autoinckey和外部键(外部键指向Notional表的键)。这会更快。 – Hogan 2009-11-23 20:29:18

+0

这是不正确的。它可以在不使用循环的情况下完成。请参阅我的答案以获取简要说明 – 2009-11-24 04:07:11

1

您可以尝试使用ROW_NUMBER在日期前选择并加入该订单。

编辑。完成连接。

你可以做的是将表加入到自身,大于该行的日期,然后按组合并选择最小值。

像这样的事情

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 
+0

这是否被认为是好的形式? – 2009-11-23 20:02:20