Konvertieren Sie eine Datums- / Uhrzeitspalte in Sekunden

11

In meiner SQL Server-Datenbank habe ich eine datetimeSpalte.

Was ist ein guter Weg, um eine neue Spalte zu erstellen, die den longWert für die datetimeSpalte darstellt? Das longwürde eine Anzahl von Sekunden darstellen.

Ich dachte, wenn ich es konvertieren könnte longs, 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.

dublintech
quelle

Antworten:

13

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

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

19000101ist die SQL Server-Epoche. Sie können 19700101zum Beispiel für die Unix-Epoche verwenden

gbn
quelle
12

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.

Aussicht

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.

Aaron Bertrand
quelle