Преобразовать столбец даты и времени в количество секунд

11

В моей базе данных SQL Server у меня есть datetimeстолбец.

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

Я подумал, что если я смогу преобразовать его в longs, это упростит группирование по запросам за промежутки времени, поскольку я мог бы просто разделить длинное число на фиксированные суммы.

Таблица статическая, не будет обновлять или удалять данные.

dublintech
источник

Ответы:

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;

время выполнения

Поскольку приведенные выше вычисления не слишком сложны, просто включите это вычисление в свой запрос. Надеемся, что вы используете хранимые процедуры для доступа к данным, поэтому вы не будете часто повторять это.

Аарон Бертран
источник