2014-12-07 117 views
-1

我有一個表(tblDates)。在這張表中我有兩列(日期,年齡)。現在我想如果我在這個表中添加新的日期,那麼Age列重新排列了那裏的值。如何重新排列列的值

表 - tblDates

Date   Age 
-------------------- 
12/01/14  5 
12/02/14  4 
12/03/14  3 
12/04/14  2 
12/05/14  1 

如果我添加了新日期即14年12月6日,然後我想造成這樣的

表 - tblDates

Date   Age 
-------------------- 
12/01/14  6 
12/02/14  5 
12/03/14  4 
12/04/14  3 
12/05/14  2 
12/06/14  1 
+1

您需要更好地定義」年齡「是如何計算的。它是按照日期排序的簡單的行編號嗎?如果日期重複或缺失,該怎麼辦?另外爲什麼你需要存儲這個值? – 2014-12-07 18:44:01

+0

然後用desc對年齡進行聚集索引。爲什麼要使用SQL,TSQL,2008和2012.它不能是所有這些東西。 – Paparazzi 2014-12-07 18:46:57

+0

RDBMS中行的順序是不相關的。使用ORDER BY子句按特定順序查看行。 – 2014-12-07 19:00:43

回答

0

拉出值是當您查詢時,您不想插入數據。您似乎想要:

select d.*, row_number() over (order by date desc) as age 
from tblDates d; 

否則,您的插入操作將變得非常繁瑣,需要更改表中的所有行。

1

我可能在閱讀過多的問題,但如果您的目標是計算從給定日期(今天?)到存儲在表格中的日期的年齡(以天爲單位),那麼您會更好使用DATEDIFF function並在每次查詢時計算其值。

例如:

-- Option 1: Compute when you query it each time in the query you require it 
SELECT d.[Date], DATEDIFF(dd, d.[Date], CONVERT(DATE, GETDATE())) as [Age] 
FROM tblDates AS d 

您也可以定義你的表作爲計算列Age列,如果它會經常不夠用,或包裹表在視圖中嵌入這個計算:

-- Option 2: Compute at query time, but build the computation into the table definition 
CREATE TABLE [dbo].[tblDates] (
    [Date] DATE NOT NULL, 
    [AgeInDaysComputed] AS (DATEDIFF(dd, [Date], CONVERT(DATE, GETDATE()))) 
) 
GO 

-- Option 3: Compute at query time, but require caller interact with a different object 
-- (view) to get the computation 
CREATE VIEW [dbo].[vwDates] 
AS 
SELECT d.[Date], DATEDIFF(dd, d.[Date], CONVERT(DATE, GETDATE())) as [AgeInDays] 
    FROM dbo.tblDates AS D 
GO 

關於GETDATE函數的一個注意事項:您需要知道您的服務器時區,因爲GETDATE根據您服務器的本地時區返回日期。只要你的服務器配置和用戶的配置都在同一時區,這應該提供正確的結果。 (如果以天爲單位的年齡是你想要計算的,你可能想要編輯你的問題以更好地反映這個意圖,爲未來的讀者帶來好處,因爲它與「重新排列列的價值」有很大的不同「)