Bonjour,
J'ai cherché un moment et la solution est dégoûtante de simplicité, encore faut-il savoir que les valeurs que vous donnez sont des entiers epoch.
C'est-à-dire qu'il représentent le nombre de dixième de microsecondes écoulées depuis le premier Janvier 1900, puisque nous sommes sous Windows (Sous Unix c'est le 1er Janvier 1970).
Le problème c'est qu'en faisant la conversion directement avec un DATEADD, on est directement confronté à un dépassement arithmétique qu'il faut contourner tout en conservant la précision.
Il faut également savoir que l'on peut manipuler des dates dans SQL Server à l'aide de flottants.
Ce qui nous amène à ceci : SELECT DATEDIFF(day, '00010101', '19000101') nous retourne le nombre jours écoulés entre la naissance de Jesus (was a Punk) et le 1er Janvier 1900.
Cela retourne 693595.
Ensuite il nous faut savoir combien de se trouvent dans un jour, ce qu'on l'on trouve en écrivant :
SELECT CAST(24 AS bigint) * 60 * 60 * POWER(10,7)
Et qui retourne 864.000.000.000.
On en vient enfin à :
1 2
| DECLARE @t bigint = 634138925370000000
SELECT CAST(@t / 864000000000.0 - 693595.0 AS DATETIME) |
Qui retourne : 2010-07-05 02:08:57.000
Est-ce que vous avez le moyen de savoir si cela est correct ?
J'ai transformé les autres valeurs que vous donnez et cela me semble cohérent.
@++
Partager