0

计算小数年日期差异的最佳方法是什么?

year(date1) - year(date2) always gives a whole number

使用 unix_timestamp 将为闰年和非闰年提供不同的值(即,20NN 年 3 月 1 日至 20NN+1 年 3 月 1 日应始终为 1.00 年)。我可以将日期分解为几个月和几天,实际上是手动完成。

但是我正在寻找最好的方法——意味着最简单并且需要最少的调试时间(如果我自己做,我会花一半的晚上测试边缘案例)。

4

2 回答 2

1

我不认为你会找到一种简单的方法来做你想做的事情。为了转换为一些十进制值,您必须了解分子和分母将是什么。正如您自己指出的那样,分母从闰年到非闰年会有所不同。这将使您不得不定义一年中哪些确切天的分母为 365,哪些天的分母为 366(即闰年从 1 月 1 日到 12 月 31 日的所有天的分母为 366,或者分母为 366在闰年前一年的 3 月 1 日到闰年的 2 月 29 日之间运行?)。

您不必为您的范围内的每一天总结每一天的价值(1/365 或 1/366)。假设您将闰年的开始定义为 1 月 1 日 - 这仍然不会为您提供 3 月 1 日(闰年)- 3 月 1 日(非闰年)的精确值 1,因为有些日子的分母为365和一些366。

如果您在闰年之前的一年的 3 月 1 日开始定义 366 的分母,那么对于 3 月 1 日 - 3 月 1 日的情况,您应该正好得到一个,但是当您想做 2 月 1 日(闰年)- 8 月 1 日(非闰年)。对于这 6 个月的差异,您现在不会得到正好 0.5。

我的猜测是,您最好通过执行类似的操作来近似您的数学

ROUND(( DATEDIFF(date1, date2) / 365.25), 2)

这将为 365 天的差异 (365/365.25 = 0.9993) 和 366 天的差异 (366/365.25 = 1.0021) 提供 1.00

当然这也意味着 3 月 2 日(非闰年)- 3 月 1 日(非闰年)也会给你一个 1.00 的值。但是,如果您的精度是小数点后两位,那么您将使用 365 作为分母获得的值 (366/365 = 1.0027)

我们的日历系统并不真正有利于对其进行数学运算,因此通常情况下,您只需要接受一个合理的近似值并了解它的局限性。

于 2012-11-28T23:29:37.817 回答
0

你的意思是:

select datediff(curdate(),'2000-01-01') / 365.25

?

于 2012-11-28T23:30:11.213 回答