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