计算分数年份的日期差异的最佳方法是什么?
year(date1) - year(date2) always gives a whole number
使用unix_timestamp将为跳跃和非跳跃年份(即3月1日,20NN到3月1日,20NN + 1应始终为1。100年)提供不同的值。我可以把日期分成几个月和几天,实际上是手工完成的。
但我正在寻找最好的方法 - 意味着最简单,并且需要最少的调试时间(如果我自己做的话,我会花半个晚上测试边缘情况)。
答案 0 :(得分:1)
我认为你不会找到一种简单的方法去做你想做的事情。为了转换为某个十进制值,您必须了解分子和分母将是什么。正如您自己所指出的,分母将从闰年到非闰年不等。这将使您必须定义一年中哪些确切天数具有365的分母并且具有366的分母(即,闰年的1月1日至12月31日的所有日期的分母为366,或者分母为366在闰年之前的3月1日到闰年的2月29日之间运行?)。
您必须总结每一天的价值(1/365或1/366)。假设您将闰年的开始定义为1月1日 - 这仍然不会给您3月1日(闰年)的确切值1 - 3月1日(非闰年),因为有些日子会有分母365和一些366。
如果您从闰年前一年的3月1日开始定义分母366,那么您应该在3月1日至3月1日获得一个分母,但是当您想要做2月1日(闰年)时会发生什么 - 8月1日(非闰年)。对于这6个月的差异,你现在不会得到0.5。
我的猜测是你可能最喜欢用
之类的东西来近似数学ROUND(( DATEDIFF(date1, date2) / 365.25), 2)
这将为您提供1.00的365天差异(365 / 365.25 = 0.9993)和366天的差异(366 / 365.25 = 1.0021)
当然这也意味着3月2日(非闰年) - 3月1日(非闰年)也会给你1.00的价值。但是如果你的精度是两位小数,那么你将使用365作为分母得到的值(366/365 = 1.0027)
我们的日历系统并不真正有利于对数学进行数学运算,所以通常情况下,你只需要接受合理的近似并理解其局限性。
答案 1 :(得分:0)
select datediff(curdate(),'2000-01-01') / 365.25