如何重新排列列的值

时间:2014-12-07 18:12:32

标签: sql sql-server sql-server-2008 tsql sql-server-2012

我有一张桌子(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

如果我添加新日期,即12/06/14,那么我想要这样的结果

表 - 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

2 个答案:

答案 0 :(得分: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列定义为Computed Column,如果它足够频繁使用,或者将表包装在View中以嵌入此计算:

-- 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会根据您服务器的本地时区返回日期。只要您的服务器配置和用户配置都在同一时区,就可以提供正确的结果。

(如果以天为单位的年龄是您正在尝试计算的内容,您可能需要编辑您的问题以更好地反映此意图,以便为将来的读者带来好处,因为它与"重新排列完全不同列的值#34;)

答案 1 :(得分:0)

在查询时拉出所需的值,而不是在插入数据时。你似乎想要:

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

否则,您的插入操作将变得非常麻烦,需要更改表中的所有行。