2010-07-29 25 views
0

我有一個數據表。我有一個顯示日期的字段。我已將此欄設置爲「開始日期」。我想創建一個額外的列作爲結束日期,其中結束日期將是下一行的開始日期。你可以通過獲取下一行中的開始日期的數據給我一個創建結束日期的查詢嗎?從下一行動態創建新的日期字段

+2

如果可以從下一行計算出來,您可能不需要存儲它。 – 2010-07-29 17:55:27

回答

1

假設你已經有你的列和你有一個自動遞增的主鍵:

Update T1 
Set T1.EndDate = T2.StartDate 
From [Table] T1 
Inner Join [Table] T2 on T1.Id = T2.Id - 1 
+0

這不考慮自動遞增鍵...我必須從下一行 – 2010-07-29 18:37:19

+0

的開始日期得到結束日期,非常感謝....這對我來說是成功的! – 2010-08-02 09:39:57

1

取決於「下一個」行的含義。

您能否提供樣本數據集,並指定您如何確定行進入的順序?

編輯

不管你創紀錄的訂單確實 - 你將必須確定那是什麼。就目前而言,我正在嘗試按照start_date排序它是可以接受的。

--GET the first relevant start date 
declare @start datetime 
set @start = select MIN(start_date) from table 

declare @end datetime 
set @end = @start 

WHILE @end is not null 

    --GET the next relevant end date 
    SET @end = select MIN(start_date) from table where start_date > @start 

    --Update the table with the end date 
    UPDATE table 
    SET end_date = @end 
    WHERE start_date = @start 

    --GET the next relevant start date 
    SET @start = @end 

END 
+0

請檢查第一個答案。示例輸出已給出。 – 2010-07-29 18:39:16

+0

*先*回答,呃? :-)他們總是改變秩序。 Anyhoo - 我在上面編輯了我的答案,基於假設「下一個」行由start_date命令確定。 – dave 2010-07-29 20:24:45

2

首先,由於表中的行沒有任何順序存儲,所以您必須提出「訂單」的定義。

當你知道你的順序是什麼,你可以創建一個存儲過程,雲:

insert into the_table (new_id, start_date) values (@id, @start_date); 

update the_table 
set end_date = @start_date 
where id = <the id determined by your sorting rule>; 
0

什麼最後一排?結束日期將是空白的?

+0

多數民衆贊成在我想要的結果就像上面的第一個答案對我的問題。什麼是查詢來計算結束日期? – 2010-07-29 18:41:47

2

我假設您目前有值,如

StartDate 
--------- 
1 Jan 1990 
2 June 1998 
4 September 2006 

你行想改成

StartDate    EndDate 
---------    ------------ 
1 Jan 1990    2 June 1998 
2 June 1998   4 September 2006 
4 September 2006  NULL 

不僅僅是冗餘和維護這個問題讓我想起了this question這樣的設置與相關的列實際上導致了原始的海報問題,當查詢數據。 (我更喜歡Unreason's answer對我自己的那個問題!)

爲什麼你需要添加EndDate列?它可能會提出一個沒有它的查詢。

編輯經過很多與row_number() faffing我實際上找不到一個更好的計劃比這個查詢。 (假設上StartDate指數)

SELECT 
     id, 
     StartDate, 
      (SELECT MIN(StartDate) 
      FROM testTable t2 
      WHERE t2.StartDate > t1.StartDate) AS EndDate 
FROM testTable t1 
+0

是的,這是我想要的輸出。在我的工作中,我們需要這個結束日期。 – 2010-07-29 18:32:17

+0

以及如何得到它? – 2010-07-29 18:34:34

+0

@sreejesh - 你在做什麼類型的查詢?你是否帶回一系列結果或查找單個記錄? – 2010-07-29 18:48:18

0

我回答這個問題,因爲它是被引用的其他地方。

根據id沒有孔是危險的。 identity列可能有空隙,目前接受的答案沒有考慮到。

在SQL Server 2012+中,答案僅僅是lag()。在table(StartDate)

Update T1 
    Set T1.EndDate = T2.StartDate 
    From [Table] T1 cross apply 
     (select top 1 t2.* 
      from [Table] T2 
      where t2.StartDate > t1.Startdate 
      order by t2.StartDate asc 
     ) t2; 

與索引,這也有可能獲得合理的性能:在早期版本中,你可以使用cross apply

+0

我認爲這應該是'where t2.StartDate> t1.Startdate'?你只需要't.StartDate' – sab669 2015-11-03 14:48:17

+0

@ sab669。 。 。是。順序方向也是錯誤的(應該是'asc'而不是'desc')。 – 2015-11-03 19:36:31