2013-04-05 2 views
12

Я работаю с пользовательской таблицей и хочу поставить «конец даты испытательного периода». В принципе, каждый новый пользователь имеет 2 полных месяца с момента их присоединения к участию в испытательном сроке. Я видел, что я могу поместить формулу в столбец для моей таблицы пользователя, но мне интересно, должен ли я иметь скрипт, который обновляет это, или если это приемлемое время для использования вычисленных столбцов. Я обращаюсь к этой таблице для разных вещей и иногда обновляю строку пользователей на основе достижений в области достижений производительности. Дата применения никогда не будет изменяться/обновляться.Рекомендации по вычисляемой колонке в SQL Server

Мой вопрос: Является ли использование вычисленного столбца хорошей практикой в ​​этой ситуации или он будет перепрограммировать каждый раз, когда я обновляю эту строку (хотя я не собираюсь обновлять дату приложения)? Я не хочу создавать дополнительные накладные расходы, когда буду обновлять строку в будущем.

Формула я использую в определении столбца для пробации Дата окончания:

(dateadd(day,(-1),dateadd(month,(3),dateadd(day,(1)-datepart(day,[APP_DT]),[APP_DT])))) 
+0

ARE «дата вступления» и «дата подачи заявки (Заметьте, что я использовал немного меньше convulted подход, чтобы получить в конце месяца, в течение двух месяцев в.) " тоже самое? Вы хотите позже обновить дату окончания испытательного срока независимо от других столбцов (столбцов) даты? –

+0

Будет ли изменяться 2-месячная политика? Может ли оно стать 1 или 3 (или некоторым другим значением) в будущем? –

+0

Да, JoinDate/AppDate то же самое (извините, я использую их взаимозаменяемо). Я никогда не буду переопределять дату, но для точки marc_s, так как она не будет обновлена, я включу это как часть скрипта вставки. Мне нужно индексировать это тоже, и без сохранения, это не будет работать так хорошо. Спасибо миллион за быстрый ответ молнии! – Brian

ответ

15

Видя, что эта дата, скорее всего, никогда не изменится, как только это установлено, это, вероятно, не является хорошим кандидатом для вычисляемого столбца.

В конце концов: после того, как вы вставляете строку в эту таблицу, вы можете легко подсчитать дату окончания «периода окончания испытательного периода» (например, в триггере), а после этого эта дата не изменится ,

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

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

+0

Благодарим вас за ответ, поэтому лучше использовать расчетный столбец, где можно постоянно менять данные.У меня есть знаменательное достижение, в котором различные достижения достигли увеличения количества людей ». Это звучит как более подходящее использование расчетного столбца, правильно? – Brian

+0

@Brian: да, что-то в этом роде. Или, если у вас есть дата, которая может меняться со временем, а для некоторых запросов вам нужно выбрать или сгруппировать по месяцам и годам этой даты - тогда рассчитанный (и сохранившийся!) Месяц и год для этой даты был бы идеальным, так как вы можете также легко индексировать сохраненные, вычисленные столбцы. –

+1

Большое спасибо, это было очень полезно! – Brian

0

При вводе данных нет накладных расходов; только когда вы читаете столбец, значения вычисляются для этого столбца. Поэтому я бы сказал, что ваш подход правильный.

11

Если вы хотите позже продлить срок пробации, не изменяя дату своего применения, то вычисленный столбец НЕ является тем, как идти. Почему бы просто не использовать ограничение DEFAULT для обоих столбцов?

USE tempdb; 
GO 

CREATE TABLE dbo.foo 
(
    MemberID INT IDENTITY(1,1), 
    JoinDate DATE NOT NULL DEFAULT SYSDATETIME(), 
    ProbationEndDate NOT NULL DEFAULT 
    DATEADD(DAY, -1, DATEADD(MONTH, DATEDIFF(MONTH,0,SYSDATETIME())+3, 0)) 
); 

INSERT dbo.foo DEFAULT VALUES; 

SELECT MemberID, JoinDate, ProbationEndDate FROM dbo.foo; 

Результаты:

MemberID JoinDate  ProbationEndDate 
-------- ---------- ---------------- 
1   2013-04-05 2013-06-30 

+3

Мне нравится этот метод в последний день месяца, используя это вместо этого :) – Brian

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