it-swarm-eu.dev

Převeďte sloupec datetime na počet sekund

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.

11
dublintech

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

13
gbn

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.

12
Aaron Bertrand