Dans SQL Server, nous pouvons utiliser la méthode suivante pour renvoyer une date et une heure basées sur un horodatage Unix donné.
L'horodatage Unix (également appelé heure d'époque Unix, heure Unix ou heure POSIX) est le nombre de secondes qui se sont écoulées depuis 00:00:00 jeudi 1er janvier 1970, temps universel coordonné (UTC).
Exemple
Voici un exemple de conversion d'un horodatage Unix en une valeur de date/heure :
SELECT DATEADD(s, 1860935119, '1970-01-01');
Résultat :
2028-12-20 14:25:19.000
Dans ce cas, l'horodatage unix était 1860935119, ce qui s'est traduit par la date et l'heure du 2028-12-20 14:25:19.000.
Date/heure actuelle
Voici un exemple qui utilise l'horodatage Unix basé sur la date/heure actuelle :
SELECT DATEADD(s, DATEDIFF(s, '1970-01-01', GETUTCDATE()), '1970-01-01');
Résultat :
2022-04-18 00:31:46.000
Attention, c'est superflu, car nous aurions pu simplement faire ceci :
SELECT GETUTCDATE();
Horodatages Unix plus grands
Face à une valeur d'horodatage Unix plus grande comme celle-ci :
SELECT DATEADD(s, 1867914562715876900, '1970-01-01');
Nous pourrions obtenir une erreur de débordement comme celle-ci :
Msg 8115, Level 16, State 2, Line 1 Arithmetic overflow error converting expression to data type int.
C'est parce que la valeur d'horodatage Unix est supérieure à ce qu'un entier peut contenir. Cet horodatage Unix contient une précision à la nanoseconde et comporte trop de chiffres pour un entier.
Nous avons plusieurs options pour régler ce problème. Une option consiste à réduire la précision :
DECLARE @ts bigint = 1867914562715876900;
SELECT DATEADD(s, CONVERT(int, LEFT(@ts, 10)), '1970-01-01');
Résultat :
2029-03-11 09:09:22.000
Ici, nous avons utilisé le LEFT()
fonction pour renvoyer uniquement les dix premiers chiffres, ainsi que le CONVERT()
fonction pour renvoyer un entier.
Si nous ne voulons pas réduire la précision, nous pouvons faire quelque chose comme ceci :
DECLARE @ts bigint = 1867914562715876900;
SELECT DATEADD(
ns,
@ts % 1000000000,
DATEADD( s, @ts / 1000000000, CAST('1970-01-01' as datetime2(7)) )
);
Résultat :
2029-03-11 09:09:22.7158769