2009-11-23 71 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