Convertir une colonne datetime en nombre de secondes

11

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

Quelle est la bonne façon de créer une nouvelle colonne qui représente la longvaleur de la datetimecolonne? Le longreprésenterait un certain nombre de secondes.

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

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

dublintech
la source

Réponses:

13

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

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

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

gbn
la source
12

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

Vue

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;

Durée

É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.

Aaron Bertrand
la source