2010-12-06 8 views
1

Je voudrais créer une fonction pour une table qui a trois colonnes entre autres comme suit:serveur sql fonction 2008 sur deux colonnes de date

insertDate datetime 
updateDate datetime 
activity integer 

Je veux mettre à jour la colonne d'activité en prenant la différence de la deux colonnes de date ... fondamentalement updateDate - insertDate = combien de jours d'activité dans la colonne d'activité. Je n'ai aucune idée de comment démarrer cela et il doit s'exécuter chaque fois qu'un insertDate ou updateDate est inséré.

Répondre

7

Vous pouvez alimenter le [InsertDate] avec une valeur par défaut de GETDATE() et peuplez [UpdateDate] avec la date actuelle lorsque vous mettez à jour la colonne (parce que vous utilisez des procédures ( clin d'oeil), ce qui est vraiment facile à contrôler). Si vous n'utilisez pas de procédures et souhaitez contrôler. la colonne [UpdateDate], vous pouvez utiliser un déclencheur pour remplir cette colonne.

Laissez la colonne Activity soit un champ calculé:

DATEDIFF(day, [InsertDate], [UpdateDate]) 

DATEDIFF

Computed Columns


des colonnes MSDNabout calculées:

Unless otherwise specified, computed columns are virtual columns that are 
not physically stored in the table. Their values are recalculated every 
time they are referenced in a query. The Database Engine uses the PERSISTED 
keyword in the CREATE TABLE and ALTER TABLE statements to physically store 
computed columns in the table. Their values are updated when any columns 
that are part of their calculation change. By marking a computed column as 
PERSISTED, you can create an index on a computed column that is 
deterministic but not precise. 
+0

+1 Pour l'idée de champ calculée. Je n'y ai pas pensé, et ce serait même une meilleure solution que l'approche de déclenchement. =) –

1

Étant donné que toutes les données requises pour cela se trouvent dans la même ligne du tableau, vous pouvez créer un computed column. Si vous voulez avoir une valeur de colonne réelle qui est mise à jour chaque fois que la ligne est mise à jour, vous devez regarder triggers.

1

Placez ce code dans un déclencheur.

update MyTable 
    set updateDate = GETDATE() 
     , activity = select (DATEDIFF(DAY, insertDate, GETDATE()))