it-swarm-eu.dev

Konvertieren Sie eine Datums- / Uhrzeitspalte in Sekunden

In meiner SQL Server-Datenbank befindet sich eine Spalte datetime.

Was ist ein guter Weg, um eine neue Spalte zu erstellen, die den Wert long für die Spalte datetime darstellt? Das long würde eine Anzahl von Sekunden darstellen.

Ich dachte, wenn ich es in longs konvertieren kann, würde es einfacher sein, Gruppen über Abfragen über Zeiträume hinweg zu gruppieren, da ich die lange Zahl einfach durch feste Beträge teilen könnte.

Die Tabelle ist statisch. Es werden keine Daten aktualisiert oder gelöscht.

11
dublintech

Erstellen Sie eine neue Spalte (ALTER TABLE) und führen Sie ein UPDATE darauf aus

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

19000101 Ist die SQL Server-Epoche. Sie können beispielsweise 19700101 Für Unix Epoch verwenden

13
gbn

Sie können eine neue Spalte hinzufügen und manuell aktualisieren, wie von @gbn vorgeschlagen. Jetzt müssen Sie diese Spalte jedoch ständig mit Triggern zum Einfügen/Aktualisieren oder einem anderen Mechanismus auf dem neuesten Stand halten. In Anlehnung an die Vermutungen von @ gbn zu Tabellen-/Spaltennamen finden Sie hier einige verschiedene Ansätze, die keine ständige Wartung erfordern.

berechnete Spalte

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

Sie können diese Spalte auch beibehalten und indizieren, um die Abfrageleistung gegen die Speicherung auszutauschen. Sie müssen jedoch eine geringfügige Änderung an der Berechnung vornehmen (wenn Sie versuchen, die oben genannten Informationen beizubehalten, wird ein Fehler angezeigt, dass die Berechnung nicht deterministisch ist):

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;

Sie möchten die Spalte beibehalten, wenn Sie sich mehr Gedanken über die Leseleistung als über die Schreibleistung (oder den Speicher) machen.

Anzeigen

Ein Vorteil einer Ansicht über eine neue Spalte besteht darin, dass Sie das Basistabellenschema nicht ändern müssen (oder sich Sorgen machen müssen, es auf dem neuesten Stand zu halten). Sie zahlen die Berechnungskosten zur Abfragezeit, was einer nicht persistenten berechneten Spalte entspricht.

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

Laufzeit

Da die obigen Berechnungen nicht zu komplex sind, nehmen Sie die Berechnung einfach in Ihre Abfrage auf. Hoffentlich verwenden Sie gespeicherte Prozeduren für den Datenzugriff, damit Sie dies nicht oft wiederholen.

12
Aaron Bertrand