我有一张桌子(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
答案 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;
否则,您的插入操作将变得非常麻烦,需要更改表中的所有行。