2013-04-14 4 views
4

Возможно ли, чтобы столбец, который должен быть автоматически рассчитан самим SQL Server 2012?Автоматически вычисляемый столбец в SQL Server 2012

Например: У меня есть три столбца START_DATE, END_DATE и DURATION.

Я хочу, чтобы получить срок, делая это:

DURATION = END_DATE - START_DATE 

Так я получаю длительность в днях.

Возможно ли, чтобы SQL Server 2012 сделал это автоматически при создании записи?

ответ

5

Да, конечно, - просто определить Duration быть вычисляемый столбец:

ALTER TABLE dbo.YourTable 
ADD Duration AS DATEDIFF(DAY, START_DATE, END_DATE) PERSISTED 

и ступай. Теперь Duration всегда будет показывать разницу (в днях) между этими двумя другими столбцами. Вычисляемое значение будет сохранено вдоль ваших других значений столбца, если вы используете ключевое слово PERSISTED. Этот столбец будет обновлен, если изменится и любой из двух зависимых столбцов.

Update: если вы хотите, чтобы получить разницу между датой и сегодня, вы можете использовать

ALTER TABLE dbo.YourTable 
ADD Duration AS DATEDIFF(DAY, START_DATE, GETDATE()) 

но, к сожалению, так как функция GETDATE() недетерминированно (в конце концов - это изменения возвращаемого значения каждый раз, когда вы его вызываете), вы не можете использовать ключевое слово PERSISTED. Это означает: каждый раз, когда вы обращаетесь к столбцу (запрашиваете его значение), расчет будет выполнен снова.

+0

Большое спасибо. И как, например, если мне нужна сегодняшняя дата, как вы выполняете одни и те же вычисления вместо END_DATE, то есть 'сегодняшняя дата - start_date'? – Brian

+0

Что я пробовал вот так: 'ALTER TABLE dbo.users ADD age AS DATEDIFF (YEAR, CAST (GETDATE() AS DATE), date_of_birth) PERSISTED', но я получаю эту ошибку:« Вычисленный столбец «возраст» в табличных пользователях 'не может сохраняться, потому что столбец не является детерминированным.' – Brian

+0

@Brian: использование' GETDATE() 'является проблемой - это недетерминированно, поэтому вы не можете сохранить значение. Если вы ** должны ** использовать 'GETDATE()', то вы должны оставить ключевое слово 'PERSISTED', и значение будет вычисляться каждый раз, когда вы обращаетесь к столбцу –

0

В вашей таблице Design введите любой из них в (Formula) в разделе «Расчетная спецификация столбцов» для получения требуемого результата.

Для Дата Разница:

CAST(job_end - job_start) AS TIME(0)) 

Для времени Продолжительность:

SUBSTRING(CONVERT(VARCHAR(20),(END_DATE-START_DATE),120),12,8) 

Аналогично можно вычислить для Second, Minute, Hour, Month, Year различия.

Синтаксис для использования DATEDIFF:

DATEDIFF (datepart , startdate , enddate) 

Для справки:

DATEDIFF(SECOND, GETDATE(), GETDATE() + 1) AS SecondDifference 
DATEDIFF(MINUTE, GETDATE(), GETDATE() + 1) AS MinuteDifference 
DATEDIFF(HOUR, GETDATE(), GETDATE() + 1) AS HourDifference 
DATEDIFF(DAY, GETDATE(), GETDATE() + 1) AS DayDifference 
DATEDIFF(WEEK, GETDATE(), GETDATE() + 1) AS WeekDifference 
Смежные вопросы