One of the many fun aspects when taking over an existing codebase is that you inevitably learn something new - if you want or not ;-).
Today a user reported a bug, that some numbers that are derived from the diff of two dates produced incoherent results. Looking at the code, it turned out that the code in question uses PostgreSQLs AGE function to get the interval between two dates. The shortest reproduce I was able to come up with that shows the questionable behavior looks like this:
SELECT AGE('2021-06-30','2021-05-19') AS age1, AGE('2021-07-01','2021-05-20') AS age2;
and returns the following surprising results
+-------------------------------------+-------------------------------------+
|age1 |age2 |
+-------------------------------------+-------------------------------------+
|0 years 1 mons 11 days 0 hours 0 mins|0 years 1 mons 12 days 0 hours 0 mins|
+-------------------------------------+-------------------------------------+
The correct answer for both cases should be 0 years 1 mons 11 days but the period for age2 is off by one day. This post will try to shed some light on the AGE function, why it produces the unexpected results and show alternatives that produce a (maybe) better result.