Converter uma coluna de data e hora em número de segundos

11

No meu banco de dados SQL Server, eu tenho uma datetimecoluna.

Qual é uma boa maneira de criar uma nova coluna que represente o longvalor da datetimecoluna? O longrepresentaria um número de segundos.

Eu pensei que se eu pudesse convertê-lo para longs, seria mais fácil agrupar consultas por períodos de tempo, pois eu poderia apenas dividir o número longo por valores fixos.

A tabela é estática, não atualizará ou excluirá dados.

dublintech
fonte

Respostas:

13

Crie uma nova coluna (ALTER TABLE) e execute uma UPDATE nela

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

19000101é a época do SQL Server. Você pode usar 19700101a época Unix, por exemplo

gbn
fonte
12

Você pode adicionar uma nova coluna e atualizá-la manualmente como @gbn sugerido, mas agora você deve manter essa coluna constantemente atualizada com gatilhos de inserção / atualização ou algum outro mecanismo. Tomando emprestado as suposições do @ gbn nos nomes de tabelas / colunas, aqui estão algumas abordagens diferentes que não exigem manutenção constante.

Coluna Computada

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

Você também pode persistir e indexar esta coluna, trocando o desempenho da consulta pelo armazenamento, mas precisará fazer uma pequena alteração no cálculo (tentar persistir no exemplo acima gera um erro sobre o cálculo não determinístico):

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;

Você deseja manter a coluna se estiver mais preocupado com o desempenho de leitura do que com o desempenho de gravação (ou armazenamento).

Visão

Um benefício de uma exibição sobre uma nova coluna é que você não precisa alterar o esquema da tabela base (ou se preocupar em mantê-lo atualizado). Você paga o custo da computação no momento da consulta, que é o mesmo que uma coluna computada não persistente.

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

Tempo de execução

Como os cálculos acima não são muito complexos, inclua o cálculo na sua consulta. Espero que você esteja usando procedimentos armazenados para acesso a dados, para que não esteja repetindo isso com frequência.

Aaron Bertrand
fonte