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.
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
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.