V databázi SQL Server mám sloupec datetime
.
Jaký je dobrý způsob vytvoření nového sloupce, který představuje hodnotu long
pro sloupec datetime
? long
by představovalo několik sekund.
Myslel jsem, že pokud to dokážu převést na longs
, usnadnilo by to seskupování podle dotazů v časových obdobích, protože jsem mohl jen vydělit dlouhé číslo pevnými částkami.
Tabulka je statická, nebude aktualizovat ani mazat data.
Vytvořte nový sloupec (ALTER TABLE) a poté na něm spusťte UPDATE
UPDATE
MyTable
SET
NewIntColumn = DATEDIFF(SECOND, '19000101', MyDateTimeColumn)
19000101
je epocha serveru SQL. Můžeš použít 19700101
například pro Unix Epoch
Můžete přidat nový sloupec a ručně jej aktualizovat podle doporučení @gbn, ale nyní musíte tento sloupec neustále aktualizovat pomocí spouštěcích/aktualizačních spouštěčů nebo nějakým jiným mechanismem. Hádání výpůjček @ gbn u názvů tabulek/sloupců, zde je několik různých přístupů, které nevyžadují stálou údržbu.
vypočtený sloupec
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));
Mohli byste také vytrvat a indexovat tento sloupec, vyměňovat výkon dotazu za úložiště, ale budete muset provést mírnou změnu výpočtu (pokus o vytržení výše poskytne chybu v tom, že výpočet není deterministický):
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;
Chtěli byste zůstat ve sloupci, pokud se více zajímáte o výkon čtení než o zápis (nebo úložiště).
Zobrazit
Jednou z výhod pohledu na nový sloupec je, že nemusíte měnit schéma základní tabulky (nebo si dělat starosti s jeho aktualizací). Náklady na výpočet platíte v době dotazu, která je stejná jako u netrvalého vypočítaného sloupce.
CREATE VIEW dbo.vMyTable
AS
SELECT -- other columns,
MyDateTimeColumn,
NewIntColumn = DATEDIFF(...whichever calc above makes sense...)
FROM dbo.MyTable;
Runtime
Vzhledem k tomu, že výše uvedené výpočty nejsou příliš složité, zahrňte výpočet pouze do svého dotazu. Doufejme, že pro přístup k datům používáte uložené procedury, takže to často neopakujete.