Tarih / saat sütununu saniye sayısına dönüştürme


11

SQL Server veritabanımda bir datetimesütun var.

Sütun longdeğerini temsil eden yeni bir sütun oluşturmanın iyi bir yolu nedir datetime? Bu long, birkaç saniyeyi temsil eder.

Eğer longsuzun bir sayıyı sabit miktarlara bölebildiğim için, bunu zaman aralıklarında sorgularla gruplandırmayı kolaylaştırır diye düşündüm .

Tablo statiktir, Veri güncellenmeyecek veya silinmeyecek.

Yanıtlar:


13

Yeni bir sütun oluşturun (ALTER TABLE) sonra üzerinde bir UPDATE çalıştırın

UPDATE
  MyTable
SET
  NewIntColumn = DATEDIFF(SECOND, '19000101', MyDateTimeColumn)

19000101SQL Server dönemidir. 19700101Örneğin Unix dönemi için kullanabilirsiniz


12

Yeni bir sütun ekleyebilir ve manuel olarak @gbn önerdiği gibi güncelleyebilirsiniz, ancak şimdi bu sütunu ekleme / güncelleme tetikleyicileri veya başka bir mekanizma ile sürekli güncel tutmanız gerekir. Borçlama @ gbn'nin tablo / sütun adlarına ilişkin tahminleri, burada sürekli bakım gerektirmeyen birkaç farklı yaklaşım var.

Hesaplanan Sütun

ALTER TABLE dbo.MyTable ADD NewIntColumn AS
  CONVERT(INT, DATEDIFF(SECOND, '19000101', MyDateTimeColumn));

--or for Unix epoch

ALTER TABLE dbo.MyTable ADD NewIntColumn AS
  CONVERT(INT, DATEDIFF(SECOND, '19700101', MyDateTimeColumn));

Ayrıca, depolama için sorgu performansını değiştirerek bu sütunu kalıcı olarak dizine ekleyebilir, ancak hesaplamada küçük bir değişiklik yapmanız gerekir (yukarıdakileri sürdürmeye çalışmak, hesaplamanın deterministik olmadığı konusunda bir hata verir):

ALTER TABLE dbo.MyTable ADD NewIntColumn AS
  CONVERT(INT, DATEDIFF(SECOND, 0, MyDateTimeColumn)) PERSISTED;

-- or for Unix epoch

ALTER TABLE dbo.MyTable ADD NewIntColumn AS
  CONVERT(INT, DATEDIFF(SECOND, 25567, MyDateTimeColumn)) PERSISTED;

Okuma performansı hakkında yazma performansından (veya depolamasından) daha fazla endişeleniyorsanız sütunu kalıcı tutmak istersiniz.

Görünüm

Yeni bir sütuna göre görünümün bir yararı, temel tablo şemasını değiştirmeniz (veya güncelliğini koruma konusunda endişelenmeniz) gerekmemesidir. Hesaplama maliyetini, kalıcı olmayan hesaplanmış sütunla aynı olan sorgu zamanında ödersiniz.

CREATE VIEW dbo.vMyTable
AS
  SELECT -- other columns,
    MyDateTimeColumn,
    NewIntColumn = DATEDIFF(...whichever calc above makes sense...)
  FROM dbo.MyTable;

Çalışma süresi

Yukarıdaki hesaplamalar aşırı karmaşık olmadığından, hesaplamayı sorgunuza ekleyin. Umarım veri erişimi için saklı yordamlar kullanırsınız, böylece bunu sık sık tekrarlamazsınız.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.