Cette question est pleine de malentendus. Tout d'abord, il faut bien comprendre la question. Le demandeur veut obtenir le même résultat que lors de l'exécution de la fonction Fonction MS SQL Server DATEDIFF ( datepart , startdate , enddate )
où datepart
prend dd
, mm
ou yy
.
Cette fonction est définie par :
Cette fonction renvoie le nombre (sous la forme d'un nombre entier signé) de limites de parties de date spécifiées franchies entre la date de début et la date de fin spécifiées.
Cela signifie combien de limites de jours, de mois ou d'années sont franchies. Pas le nombre de jours, de mois ou d'années qui les séparent. C'est pourquoi datediff(yy, '2010-04-01', '2012-03-05')
est 2, et non 1. Il y a moins de deux ans entre ces dates, ce qui signifie qu'une seule année entière s'est écoulée, mais que deux années se sont écoulées, de 2010 à 2011 et de 2011 à 2012.
Voici mes meilleurs efforts pour reproduire correctement la logique.
-- datediff(dd`, '2010-04-01', '2012-03-05') = 704 // 704 changes of day in this interval
select ('2012-03-05'::date - '2010-04-01'::date );
-- 704 changes of day
-- datediff(mm, '2010-04-01', '2012-03-05') = 23 // 23 changes of month
select (date_part('year', '2012-03-05'::date) - date_part('year', '2010-04-01'::date)) * 12 + date_part('month', '2012-03-05'::date) - date_part('month', '2010-04-01'::date)
-- 23 changes of month
-- datediff(yy, '2010-04-01', '2012-03-05') = 2 // 2 changes of year
select date_part('year', '2012-03-05'::date) - date_part('year', '2010-04-01'::date);
-- 2 changes of year