SQL Server : Comment calculer l'age du capitaine (différences sur des dates) ?
Comment calculer la différence d'une date par rapport à une autre avec SQL Server, le tout en année ou en mois ?
Rien de plus simple me direz vous, la réponse c'est DATEDIFF :
DECLARE
@debut datetime
DECLARE @fin datetime
SET @debut = '20070404'
SET @fin = '19780404'
SELECT DATEDIFF(YEAR, @fin, @debut)
Pas de problème ici j'ai bien eu 29 ans cette année (je me fais vieux je sais)...
Mais remplaçons 20070404 par 20070403... La veille de mon anniversaire d'après SQL Server j'avais déjà 29 ans ????
Pourquoi, parce que SQL Server fait uniquement la différence sur la composante année de la date résultat, il y a une période où votre age est faux ! Le problème est le même en réalisant la différence avec les mois.
Pour ne pas vieillir avant l'heure voici une méthode juste pour réaliser ce calcul (ce n'est sans doute pas la seule, mais l'une des plus éfficaces)
DECLARE @debut datetime
DECLARE @fin datetime
SET @debut = '20070403'
SET @fin = '19780404'
SELECT (0 + CONVERT(char(8),@debut,112) - CONVERT(char(8),@fin,112)) / 10000
L'idée est de soustraire la date en format YYYYMMDD ou AAAAMMJJ et de tronquer le résultat pour obtenir l'age.
Le 0 + n'est là que pour réaliser une conversion implicte. C'est Steve Kass autre MVP Server qui est l'inventeur de cette formule fort utile. Merci à lui !
Pour le calcul de la différence sur des jours, celà donne :
DECLARE @debut datetime
DECLARE @fin datetime
SET @debut = '19780404'
SET @fin = '20070403'
SELECT DATEDIFF(DAY, @debut, @fin)
Merci à Cédric pour le calcul.
Bon calcul...
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :