2014-12-07 2 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 

Если добавить новые даты ИЭ, 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 
+1

Вам нужно лучше определить, как рассчитывается« возраст ». Является ли это просто прямым номером строки, как указано по дате? Что делать, если есть повторяющиеся или отсутствующие даты? Также почему вам нужно сохранить это значение? –

+0

Затем введите кластеризованный индекс по возрасту с desc. Почему SQL, TSQL, 2008 и 2012. Это не может быть все это. – Paparazzi

+0

порядок строк в СУБД не имеет значения. Используйте предложение ORDER BY, чтобы увидеть строки в определенном порядке. –

ответ

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 

Вы также можете определить столбец Возраст на вашем столе в качестве колонки Компьютерной если она будет использоваться достаточно часто, или обернуть таблицы в представлении, чтобы встроить это вычисление:

-- 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 возвращает дату в соответствии с локальным часовым поясом вашего сервера. Пока конфигурация вашего сервера и пользовательские конфигурации находятся в одном и том же часовом поясе, это должно обеспечить правильный результат.

(Если возраст в то время, который вы пытаетесь вычислить, вы можете отредактировать свой вопрос, чтобы лучше отразить это намерение в интересах будущих читателей, поскольку он сильно отличается от «переупорядочения значений столбцов ")

Смежные вопросы