Diese Frage ist voller Missverständnisse. Lassen Sie uns zunächst die Frage vollständig verstehen. Der Fragesteller hat will das gleiche Ergebnis wie bekommen , wenn die Lauf MS SQL Server - Funktion DATEDIFF ( datepart , startdate , enddate )
, wo datepart
nimmt dd
, mm
oder yy
.
Diese Funktion ist definiert durch:
Diese Funktion gibt die Anzahl (als vorzeichenbehafteten ganzzahligen Wert) der angegebenen Datumsteilgrenzen zurück, die zwischen dem angegebenen Start- und Enddatum überschritten wurden.
Das heißt, wie viele Tages-, Monats- oder Jahresgrenzen überschritten werden. Nicht wie viele Tage, Monate oder Jahre es zwischen ihnen ist. Deshalb datediff(yy, '2010-04-01', '2012-03-05')
ist 2 und nicht 1. Zwischen diesen Daten liegen weniger als 2 Jahre, was bedeutet, dass nur 1 ganzes Jahr vergangen ist, aber 2 Jahre Grenzen überschritten haben, von 2010 bis 2011 und von 2011 bis 2012.
Das Folgende ist mein bester Versuch, die Logik korrekt zu replizieren.
-- 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