web-dev-qa-db-fra.com

Convertir une colonne datetime en nombre de secondes

Dans ma base de données SQL Server, j'ai une colonne datetime.

Quelle est la bonne façon de créer une nouvelle colonne qui représente la valeur long pour la colonne datetime? long représenterait un certain nombre de secondes.

J'ai pensé que si je pouvais le convertir en longs, cela faciliterait le regroupement par requêtes sur des périodes de temps, car je pourrais simplement diviser le nombre long par des montants fixes.

Le tableau est statique, ne mettra pas à jour ou ne supprimera pas de données.

11
dublintech

Créez une nouvelle colonne (ALTER TABLE) puis exécutez une MISE À JOUR dessus

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

19000101 est l'époque de SQL Server. Vous pouvez utiliser 19700101 pour Unix Epoch par exemple

13
gbn

Vous pouvez ajouter une nouvelle colonne et la mettre à jour manuellement comme l'a suggéré @gbn, mais maintenant vous devez constamment garder cette colonne à jour avec des déclencheurs d'insertion/mise à jour ou un autre mécanisme. En empruntant les suppositions de @ gbn sur les noms de table/colonne, voici quelques approches différentes qui ne nécessitent pas de maintenance constante.

Colonne calculée

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

Vous pouvez également persister et indexer cette colonne, en compromettant les performances des requêtes pour le stockage, mais vous devrez apporter une légère modification au calcul (essayer de persister ce qui précède produira une erreur sur le calcul non déterministe):

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;

Vous souhaitez conserver la colonne si vous êtes plus préoccupé par les performances de lecture que par les performances d'écriture (ou de stockage).

Voir

Un avantage d'une vue sur une nouvelle colonne est que vous n'avez pas à modifier le schéma de la table de base (ou à vous soucier de le mettre à jour). Vous payez le coût du calcul au moment de la requête, qui est le même qu'une colonne calculée non persistante.

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

Runtime

Étant donné que les calculs ci-dessus ne sont pas trop complexes, incluez simplement le calcul dans votre requête. J'espère que vous utilisez des procédures stockées pour l'accès aux données, donc vous ne répétez pas cela souvent.

12
Aaron Bertrand