2013-04-05 26 views
12

Bir kullanıcı masasında çalışıyorum ve bir "son kullanma tarihi sonu" koymak istiyorum. Temel olarak, her yeni kullanıcının, deneme sürelerinin bir parçası olarak katıldıkları zamandan itibaren 2 tam ayı vardır. Kullanıcı masamın sütununa bir formül koyabildiğimi gördüm, ancak bunun yerine güncelleyen bir komut dosyası mı yoksa hesaplanan sütunlar kullanmak için kabul edilebilir bir zaman mı diye merak ediyorum. Bu tabloya çeşitli şeyler için erişiyorum ve zaman zaman kullanıcıların satırını performans kilometre taşı başarılarına göre güncelleyeceğim. Başvuru tarihi asla değişmeyecek/güncellenmeyecektir.SQL Server'da Hesaplanan Sütun için En İyi Yöntemler

Soruma şudur: Bu durumda, hesaplanan sütunu iyi bir uygulama kullanıyor mu veya bu satırı güncelleştirdiğimde her seferinde (Uygulama Tarihini güncelleyemesem de) yeniden komut verilecek mi? Gelecekte satırı güncellediğimde daha fazla ek yük oluşturmak istemiyorum. Ben Denetimli Serbestlik Bitiş tarihi sütun tanımı kullanıyorum

Formülü:

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

"katılma tarihi" Are ve "başvuru tarihi (iki ay dışarı için ayın sonunu almak için biraz daha az convulted yaklaşımı kullanılır dikkat edin.) " aynı şey? Daha sonra, deneme bitiş tarihini diğer tarih sütunundan bağımsız olarak güncelleyebilmek ister misiniz? –

+0

2 aylık politika değişecek mi? Gelecekte 1 veya 3 (veya başka bir değer) olabilir mi? –

+0

Evet, JoinDate/AppDate aynı şeyi (üzgünüm, bunları birbirinin yerine kullanıyorum). Tarihi geçersiz kılmayacağım, ancak marc_s noktasına, güncellenmeyeceğinden, bunu insert komut dosyasının bir parçası olarak ekleyeceğim. Bunu da indekslemeliyim, ve kalıcı olmadan, bu işe yaramayacak. Yıldırım hızlı cevap için bir milyon teşekkür! – Brian

cevap

15

ayarlandıktan sonra bu tarih muhtemelen hiç değişmeyeceğini görünce, muhtemelen hesaplanan sütun için iyi bir aday değil.

Sonuçta: o tablonun içine bir satır ekledikten sonra, o anda "deneme süresi sonu" tarihini kolayca hesaplayabilir ve sonra (örneğin bir tetikleyicide), ve bir kez ayarlandığında, bu tarih hiç değişmeyecektir .

Bu şekilde kesinlikle bu şekilde yapabilirsiniz, muhtemelen bir kez hesaplar ve daha sonra bu tarih kaydeder bir AFTER INSERT tetikleyici (veya INSERT işlemi için saklı yordamı) kullanmayı tercih ediyorum.

Ayrıca, sadece bir başlık gibi: sadece her zaman formülüne sahip hesaplanmış bir sütun hesaplanır - her zaman bunun farkında olun. Yani, PERSISTED anahtar sözcüğünü belirtmediğiniz sürece, sonuçta satırdaki diğer veriler yan yana saklanır ve bu burada daha iyi bir uyum olacaktır - yine, bu değer hesaplandıktan sonra, bir daha değiştir.

+0

Cevabınız için teşekkür ederiz, bu yüzden hesaplanan bir sütunun daha iyi kullanılması, sürekli değişen verinin olduğu yerde olabilir.Çeşitli başarıların bir araya geldiği bir kişinin puanını arttıran bir kilometre taşı başarı takvimi var. Bu hesaplanan sütunun daha uygun bir kullanımı gibi görünüyor, değil mi? – Brian

+0

@Brian: evet, böyle bir şey. Ya da zaman içinde değişebilecek bir tarihiniz varsa ve bazı sorgular için o tarihin ayını ve yılını seçmeniz veya gruplandırmanız gerekiyorsa - o tarih için hesaplanan (ve devam eden!) Ay ve yılı mükemmel olabilir. Ayrıca, bu kalıcı, hesaplanmış sütunları oldukça kolayca indeksleyin. –

+1

Çok teşekkürler, bu çok yardımcı oldu! – Brian

0

Veri eklediğinizde ek yük yok; Sadece sütunu okuduğunuzda değerler bu sütun için hesaplanır. Bu yüzden yaklaşımınızın doğru olduğunu söyleyebilirim.

11

Daha sonra bir kişinin deneme süresini uygulama tarihini değiştirmek zorunda olmadan uzatmak istiyorsanız, o zaman hesaplanan bir sütun DEĞİLDİR. Her iki sütun için neden sadece DEFAULT kısıtlaması kullanılmıyor?

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; 

Sonuçlar:

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

+3

Ayın son günü için bu yöntemi seviyorum, bunun yerine kullanıyorum :) – Brian

İlgili konular