Перетворіть стовпець часу в число секунд


11

У моїй базі даних SQL Server у мене datetimeстовпець.

Який хороший спосіб створити новий стовпець, який представляє longзначення для datetimeстовпця? Значення longозначало б кількість секунд.

Я думав, що якщо я можу це перетворити longs, це полегшить групування за запитами за часовими періодами, оскільки я можу просто розділити довге число на фіксовані суми.

Таблиця статична, не оновлюється та не видаляється дані.

Відповіді:


13

Створіть новий стовпець (ALTER TABLE), а потім запустіть оновлення на ньому

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

19000101- це епоха SQL Server. 19700101Наприклад, ви можете використовувати для епохи Unix


12

Ви можете додати новий стовпець і оновити його вручну, як було запропоновано @gbn, але тепер вам доведеться постійно оновлювати цей стовпець за допомогою тригерів вставлення / оновлення чи іншого механізму. Запозичення @ gbn про назви таблиць / стовпців, ось кілька різних підходів, які не потребують постійного обслуговування.

Обчислена колона

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

Ви також можете зберегти та проіндексувати цей стовпець, торгуючи ефективністю запитів для зберігання, але вам доведеться внести невеликі зміни в обчислення (спроба наполягати на вищесказаному призведе до помилки, що обчислення не детерміновані):

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;

Ви хочете зберегти стовпець, якщо вас більше турбує ефективність читання, ніж продуктивність запису (або зберігання).

Вид

Однією з переваг перегляду нового стовпця є те, що вам не доведеться змінювати схему базової таблиці (або турбуватися про її оновлення). Ви оплачуєте витрати на обчислення за час запиту, який такий же, як і неперсинований обчислений стовпець.

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

Час виконання

Оскільки наведені вище розрахунки не надто складні, просто включіть розрахунок у свій запит. Сподіваємось, ви використовуєте збережені процедури для доступу до даних, тому ви не повторюєте це часто.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.