Konwertuj kolumnę daty i godziny na liczbę sekund

11

W mojej bazie danych SQL Server mam datetimekolumnę.

Jaki jest dobry sposób na utworzenie nowej kolumny reprezentującej longwartość dla datetimekolumny? longStanowiłoby liczbę sekund.

Pomyślałem, że jeśli uda mi się go przekonwertować longs, łatwiej byłoby grupować zapytania według przedziałów czasowych, ponieważ mógłbym po prostu podzielić długą liczbę na ustalone kwoty.

Tabela jest statyczna, nie będzie aktualizować ani usuwać danych.

dublintech
źródło

Odpowiedzi:

13

Utwórz nową kolumnę (ALTER TABLE), a następnie uruchom na niej UPDATE

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

19000101to epoka SQL Server. Możesz użyć 19700101na przykład dla epoki Uniksa

gbn
źródło
12

Możesz dodać nową kolumnę i ręcznie ją zaktualizować zgodnie z sugestią @gbn, ale teraz musisz stale aktualizować tę kolumnę za pomocą wyzwalaczy wstawiania / aktualizacji lub innego mechanizmu. Pożyczając przypuszczenia @ gbn na temat nazw tabel / kolumn, oto kilka różnych podejść, które nie wymagają stałej konserwacji.

Kolumna obliczona

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));

Możesz również zachować i zindeksować tę kolumnę, odkładając wydajność zapytania na przechowywanie, ale musisz wprowadzić niewielką zmianę w obliczeniach (próba utrzymania powyższego spowoduje błąd, że obliczenia nie są deterministyczne):

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;

Chcesz zachować tę kolumnę, jeśli bardziej martwi Cię wydajność odczytu niż wydajność zapisu (lub pamięci masowej).

Widok

Jedną z zalet widoku nowej kolumny jest to, że nie trzeba zmieniać schematu tabeli podstawowej (ani martwić się o aktualizację). Płacisz koszt obliczeń w czasie zapytania, który jest taki sam jak nietrwałej kolumny obliczeniowej.

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

Środowisko wykonawcze

Ponieważ powyższe obliczenia nie są zbyt skomplikowane, wystarczy uwzględnić obliczenia w zapytaniu. Mamy nadzieję, że korzystasz z procedur przechowywanych w celu uzyskania dostępu do danych, więc nie powtarzasz tego często.

Aaron Bertrand
źródło